strcmp不适用于fgets文件读取输入字符串

ami*_*man 2 c

我正在从文件中读取文字并需要搜索一些特定的单词,下面是我的代码

string read = malloc(50 * sizeof(char));

FILE* p = fopen("word","r");

while(fgets(read,50,p))
{
    printf("%s\n",read);
    if(strcmp(read,"apple") == 0)
     {
        printf("apple found\n");
        break;
     }
}
Run Code Online (Sandbox Code Playgroud)

样本文件'word'如下,

$: more word

liol
apple
scizzors
big
bang
mentalist
scapegrace
goat
goti
Run Code Online (Sandbox Code Playgroud)

为什么strcmp在这种情况下不工作,printf可以打印字符串读取,所以char指针工作正常.

pax*_*blo 7

fgets()在大多数情况下,该功能会在行尾保留换行符.因此yourtext\n不会比较等于yourtext.你会用我最喜欢的一个检查字符串的技巧来注意这一点:

printf ("[%s]\n", read);
Run Code Online (Sandbox Code Playgroud)

在关闭之前存在换行符]会立即提醒您出现问题,或者至少引起一阵眉毛.

如果您想在比较之前删除换行符,您可以执行以下操作:

int ln = strlen (read);
if ((ln > 0) && (read[ln-1] == '\n'))
    read[ln-1] = '\0';
Run Code Online (Sandbox Code Playgroud)

或者,你可以跳过它,只是做:

if (strcmp (read,"apple\n") == 0)
Run Code Online (Sandbox Code Playgroud)

它不一定优雅但是,如果你不需要将这个词用于除了那个比较之外的任何东西,那就没关系了.

但是,您可能需要担心文件中的最后一行,以防它在结尾处没有换行符,所以最好使用上面的换行符代码.