首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANSI C strstr()不使用指针

ANSI C strstr()不使用指针
EN

Stack Overflow用户
提问于 2016-11-06 10:04:00
回答 3查看 932关注 0票数 0

我试图使用strstr()在字符串中查找子字符串。只使用char[]工作,char*不起作用,会产生分割错误。

所以这一条起作用了:

代码语言:javascript
复制
int main() {
    char str[] = "apple apple peach";
    char *p;

    p = strstr(str, "peach");
    if (p!= NULL) {
        strncpy(p, "apple", 5);
    }
    return 0;
}

但这个不起作用:

代码语言:javascript
复制
int main() {
    char *str = "apple apple peach";
    char *p;

    p = strstr(str, "peach");
    if (p!= NULL) {
        strncpy(p, "apple", 5);
    }
    return 0;
}

这两个都不是:

代码语言:javascript
复制
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;
}

但这两个都没有:

代码语言:javascript
复制
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还是特征?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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限定的内容。

票数 3
EN

Stack Overflow用户

发布于 2016-11-06 10:07:13

你的问题不是strstr,而是strncpy。在指针的情况下,您使用strncpy尝试写入字符串文字,这是常量。

票数 5
EN

Stack Overflow用户

发布于 2016-11-06 10:07:33

它与strstr无关:它按预期工作。崩溃发生在strcpy中,当您试图修改分配给字符串文本的内存时。这是未定义的行为。

解决这个问题的关键是将数据放入允许写入的内存中。您的第一个程序通过将str声明为数组来做到这一点:

代码语言:javascript
复制
char str[] = "apple apple peach";

这不是UB,所以程序运行到完成。另一种选择是在动态内存中分配str,如下所示:

代码语言:javascript
复制
char *str = malloc(20);
strcpy(str, "apple apple peach");
char *p;
p = strstr(str, "peach");
if (p!= NULL) {
    strncpy(p, "apple", 5);
}
free(str);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40448094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档