使用“=”运算符复制char *内容

时间:2014-02-16 10:26:52

标签: c++

嗨在我的代码中我有一个存储在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错误(双重释放或损坏)。

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

5 个答案:

答案 0 :(得分:3)

首先,永远不要将字符串文字指定给指向非const char的指针:

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时,您都会犯错误。

答案 1 :(得分:1)

delete[] str1;

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

正如其他答案所暗示的那样,无论如何你应该使用std::string

答案 2 :(得分:0)

使用以下strncpy复制字符串,

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

答案 3 :(得分:0)

因为这是C ++,为了爱上帝,请使用std::string

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

答案 4 :(得分:0)

delete[] str1; - 这是为您提供细分错误的行。 str1被声明为常量字符串文字。无需为delete

致电str1