在 C 中使用 strcmp 的分段错误



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

// 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;    
}

您不能保证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 个字符,则可能无法找到该字符串。

数组

buff不是以空结尾的。您需要为str...系列函数执行此操作

PS:学习缩进代码PPS:使用调试器查找buff的值<</p>

div class="ans>
char *substring=strstr(buff, string);
    if ((strcmp(buff, substring)) == 0)
        return true;

char *substring在你有匹配的情况下,如果没有匹配项,substring指向 buf 内部的某个地方,substring指向 NULL ,当你这样做时strcmp(buff,substring)这永远不会为零。

如果buff没有NULL终止,那么问题就会出现在strcmp。 在这种情况下,在声明部分初始化buff变量(零)。否则,请检查filesize,然后在buff处添加NULL字符:

[filesize+1]=''.

相关内容

  • 没有找到相关文章

最新更新