在C中使用strcmp进行分段错误?

时间:2014-02-09 03:56:20

标签: c string segmentation-fault strcmp

运行代码时出现Segmentation Fault(核心转储)错误。在使用了一些printf语句后,我发现strcmp部分有一个错误,也许是因为将char与字符串进行比较?我该如何解决这个问题?

// this function checks if the file contains the *string

bool checkIfMatch(char *string, FILE *file) {

    while (true) {

        char buff[1024];
        fgets(buff, sizeof buff, file);
        if (buff == NULL)
            break;

        char *substring=strstr(buff, string);
        if ((strcmp(buff, substring)) == 0)
            return true;
    }

    return false;    
}

4 个答案:

答案 0 :(得分:1)

您无法保证substring不为NULL。所以你需要测试它:

bool checkIfMatch(char *string, FILE *file) {
    char buff[1024];
    while (fgets(buff, sizeof buff, file)) {
        char *substring=strstr(buff, string);
        if (substring && !strcmp(buff, substring)) 
            return true;
    }
    return false;
}

其他问题:

  • 在您的代码if (buff == NULL) break;永远不会导致中断。您需要测试fgets的返回值。 (见WhozCraig的评论)

  • fgets保留回车符,这可能不是你想要的。

  • strstr / strcmp很困惑:你可能只想要strcmp,或者只是strstr

  • 如果文件的行长度超过1022个字符,则可能会错过查找字符串。

答案 1 :(得分:0)

数组buff未终止。您需要为str...函数族

执行此操作

PS:学习缩进代码 PPS:使用调试器查找buff

的值

答案 2 :(得分:0)

如果buffNULL终止,则问题将出现在strcmp中。在您的情况下,在声明部分初始化buff变量(为零)。否则,请检查filesize,然后在NULL

添加buff字符
[filesize+1]='\0'.

答案 3 :(得分:0)

char *substring=strstr(buff, string);
    if ((strcmp(buff, substring)) == 0)
        return true;

char *substring如果您有匹配项,substring指向buf中的某个位置,如果没有匹配substring指向NULL,那么strcmp(buff,substring) {1}}这永远不会为零。