【问题标题】:Segmentation Fault using strcmp in C?在 C 中使用 strcmp 的分段错误?
【发布时间】:2014-02-09 03:56:20
【问题描述】:

我在运行代码时遇到分段错误(核心转储)错误。使用一些 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;    
}

【问题讨论】:

  • 使用 strncmp() 代替 strcmp() 即 strlen(substring)。
  • 这个:if(buff ==NULL) break;永远导致中断;使用if (fgets(buff, sizeof buff, file) == NULL) break;strcmp 中使用它们之前,您也永远不会检查strstr 的结果。
  • and strcmp and strstr 只需要一个或另一个重复项就足够了。

标签: c string segmentation-fault strcmp


【解决方案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(正在等待 CRLF 检测)。我同意strstr/strcmp 的困惑,我认为 strncmp 会做OP 想要做的事情,但很难说。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:
    char *substring=strstr(buff, string);
        if ((strcmp(buff, substring)) == 0)
            return true;
    

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

    【讨论】:

      【解决方案4】:

      如果buff 不是NULL 终止,那么问题将出现在strcmp。在您的情况下,在声明部分初始化 buff 变量(为零)。否则检查filesize,然后在buff处添加NULL字符:

      [filesize+1]='\0'.
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-14
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多