我试图使用strstr()在字符串中查找子字符串。只使用char[]工作,char*不起作用,会产生分割错误。
所以这一条起作用了:
int main() {
char str[] = "apple apple peach";
char *p;
p = strstr(str, "peach");
if (p!= NULL) {
strncpy(p, "apple", 5);
}
return 0;
}但这个不起作用:
int main() {
char *str = "apple apple peach";
char *p;
p = strstr(str, "peach");
if (p!= NULL) {
strncpy(p, "apple", 5);
}
return 0;
}这两个都不是:
int main() {
char *str = "apple apple peach";
char *peach = "peach";
char *p;
p = strstr(str, peach);
if (p!= NULL) {
strncpy(p, "apple", 5);
}
return 0;
}但这两个都没有:
int main() {
char *str = "apple apple peach";
char peach[] = "peach";
char *p;
p = strstr(str, peach);
if (p!= NULL) {
strncpy(p, "apple", 5);
}
return 0;
}这是已知的bug还是特征?
发布于 2016-11-06 10:10:06
string-literal 是不安全的!使用char[]的之所以成功,仅仅是因为strncpy(p, "apple", 5);修改了字符串的复制版本--文字,而不是本身。标准中的有关段落如下:
6.4.5第6款 .多字节字符序列然后使用初始化一个静态存储时间和长度的数组,该数组仅足以包含该序列. 6.4.5第7款 ..。如果程序试图修改这样的数组,则行为是未定义的。
简而言之,字符串-文字是用数组代替的(conceptually),修改它是不安全的。请注意,字符串-文字不一定是const-限定的,尽管MSVC++似乎要求字符串-文字是const char *或其他const限定的内容。
发布于 2016-11-06 10:07:13
你的问题不是strstr,而是strncpy。在指针的情况下,您使用strncpy尝试写入字符串文字,这是常量。
发布于 2016-11-06 10:07:33
它与strstr无关:它按预期工作。崩溃发生在strcpy中,当您试图修改分配给字符串文本的内存时。这是未定义的行为。
解决这个问题的关键是将数据放入允许写入的内存中。您的第一个程序通过将str声明为数组来做到这一点:
char str[] = "apple apple peach";这不是UB,所以程序运行到完成。另一种选择是在动态内存中分配str,如下所示:
char *str = malloc(20);
strcpy(str, "apple apple peach");
char *p;
p = strstr(str, "peach");
if (p!= NULL) {
strncpy(p, "apple", 5);
}
free(str);https://stackoverflow.com/questions/40448094
复制相似问题