ANSI C strstr()不使用指针

时间:2016-11-06 10:04:00

标签: c strstr strncpy string.h

我试图使用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;
}

这是一个已知的错误或功能吗?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

string-literal 无法安全修改! char[]的成功仅因为strncpy(p, "apple", 5);修改了 string-literal ,不是 string-literal 本身。标准中的相关段落如下:

  

6.4.5,第6段

     

... 然后使用多字节字符序列来初始化一个静态存储持续时间和长度的数组,足以包含序列......

     

6.4.5,第7段

     

...如果程序尝试修改此类数组,则行为未定义。

简而言之,string-literal被(概念上)替换为数组,修改它是不安全的。请注意, string-literal 不一定是const限定的,尽管MSVC ++似乎要求 string-literal const char *或者某些东西合格。

答案 2 :(得分:1)

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

解决此问题的关键是将数据放入允许写入的内存中。你的第一个程序是通过声明strcpy一个数组来实现的:

str

那不是UB,所以程序运行完成。另一种选择是在动态内存中分配char str[] = "apple apple peach"; ,如下所示:

str