嗨在我的代码中我有一个存储在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错误(双重释放或损坏)。
有人请告诉我是什么原因。
答案 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
。
每当您使用new
和delete
时,您都会犯错误。
答案 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