fgets故障排除

3
#include <stdio.h>
#include <string.h>
int main()
{
    FILE *pInFile;
    pInFile = fopen("fileName.txt", "r");
    char line[200];

    while (fgets(line, sizeof(line), pInFile)) { 
        printf("\n%s", line);
        if (strcmp(line, "C")==1)
            printf("Success");

    }

    return 0;
}

这个程序的目标是在每次读到"C"这一行时打印出“成功”。例如,我的文本文件如下所示:

C
C
C
C

我希望它能够打印出来

C
Success
C
Success
C
Success
C
Success

然而,由于某种原因,它只打印了这个。

C
Success
C
Success
C
Success
C

而且最后一个“Success”被省略了。我完全不知道为什么会这样。

不要依赖于 if (strcmp(line, "C")==1)strcmp() 不一定会返回 +1。如果第一个参数比第二个参数大,则它可能返回任何大于 0 的数字。将其更改为 if (strcmp(line, "C") > 0)。哦,还要注意空格 - user529758
3个回答

3

strcmp()函数在两个字符串相等时返回0。

尝试将条件语句更改为以下内容:

if (line[0] == 'C') {
    printf("Success");
}

解释您发布输出的原因:

  1. fgets on the first line gets the following into line:

    C\n
    
  2. so when you strcmp(line, "C") == 1 it succeeds because strcmp() returns >0 if 2nd argument > 1st argument.

  3. this happens for all the lines except the last one.

  4. Therefore in the last line strcmp() returns 0 as the strings are equal and you don't print succeed

为了解决这个问题,可以按照Gangadhar在他的帖子中提出的方法或者我上面展示的方法进行操作。

当我将其设置为0时,它会完全相反,并且仅打印出最后一个成功。 - user2930701
你能解释一下 line[0] 这行代码的含义吗? - user2930701
@user2930701 没问题,伙计。 - sukhvir

1
< p > 当字符串相等时,strcmp() 的返回值为0。 < /p >

你之所以会得到这种行为,是因为line的内容是“C\n”,fgets()会读取除最后一行外所有行的终止换行符,而对于最后一行则是EOF。这就是为什么strcmp()返回1的原因,因为第一个字符串更大。 - jester
正如最后一个案例所说,应该是“C<EOF>”而不是“C\n”。你需要改变你的方法:line[0]=='C'可能是更好的比较方式。 - jester
这就是我所说的,更好的方法是将您的比较更改为line [0] == 'C',而不是在条件中考虑<EOF>。 <EOF>条件由while(fgets(...))自动处理,这应该是更好的方法。如果您仍然想明确处理<EOF>,则有一个定义的宏“EOF”。 - jester
顺便提一下,line是一个字符数组,而line[0]是数组中的第一个字符,根据您的文本文件格式,它将始终为'C'。因此,比较line[0]=='C'是有效的。 - jester
这个EOF是如何工作的?我的最终目标是在一个包含多个字符而不仅仅是一个字符的文本文件上运行这个程序。 - user2930701
显示剩余3条评论

1

您可以使用strncmp()函数来比较1个字符。

 if (strncmp(line, "C" ,1)==0)
            printf("Success");

@H2CO3 是的,但如果OP想比较不止一个字符,那么strncmp()会有帮助。 - Gangadhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接