运行代码时出现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;
}
答案 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)
如果buff
未NULL
终止,则问题将出现在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}}这永远不会为零。