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