使用"="运算符复制字符* 内容



嗨 在我的代码中,我有一个存储在 char* 中的字符串,我只想将字符串的一部分复制到另一个 char*。 比如说,

    char * str1 = "I am new to c++";
    // I am creating new char pointer
    char * str2 = new char[20];
    int startpos = 5;
    int destpos = 0;
    // i am checking for the white space from the start posistion
    while(str1[startpos]!=' '){
    str2 [destpos++] = str1[startpos++];
    }
    printf("n New String is %s",str2);
    // now i am deleting the char*
    delete[] str2;
    delete[] str1;

我正在使用这种操作,此代码有时正常运行并导致 seg 错误(双重释放或损坏)。

有人请告诉我是什么原因。

首先,永远不要将字符串文字分配给指向非常量字符的指针:

char* str1 = "I am new to c++"; // bad
char const* str1 = "I am new to c++"; // good

其次,永远不要delete[]字符串文字。

如果您想要理智,请使用std::string

std::string str1("I am new to c++");
int startpos = 5;
std::string str2;
for (auto it = str1.begin() + startpos; it != str1.end(); ++it) {
    if (*it == ' ')
        break;
    str2.push_back(*it);
}
std::cout << "n New String is " << str2;

有关详细信息,请参阅std::string

每当你使用newdelete时,你都做错了™。

delete[] str1;

是未定义的行为,因为 str1 是一个字符串文字,而不是使用新分配的 char 数组 (new char[N] 初始化的 char 指针。这可能就是您的程序以分段错误结束的原因。

正如其他答案所建议的那样,无论如何,您可能都应该使用std::string

由于这是C++,为了上帝的爱,请使用std::string。

(P.S.,它失败了,因为"str1"被分配了只读内存的地址;它没有动态分配new[]或malloc。因此,它不应该传递给 delete[] 或 free())。

delete[] str1; - 这是给你分段错误的行。 str1声明为常量字符串文本。无需为str1调用delete

使用strncpy如下方式复制字符串,

memset(str2, 0, strlen(str2)); 
strncpy(str2 + destpos, str1 + startpos, sizeof(strlen(str1) - startpos - 1));

相关内容

最新更新