使用fgets时代码没有执行到语句?

3

我编写了一段代码,其中使用了fgets函数,并在多个条件下调用了代码中的其他函数,即aMethod和bMethod。

int main(void) {
char buffer[1024];
while (fgets(buffer, 1024, stdin)) {
    if ((strcasecmp(buffer,"a")) == 0) {
        aMethod();
        }
    if ((strcasecmp(buffer, "b")) == 0) {
        bMethod();
        }
    }
}

我不确定为什么它没有到达if语句。 任何帮助都将是极好的,谢谢。

3个回答

1
如果有疑问,就打印出来:
int main(void) {
char buffer[1024];
while (fgets(buffer, 1024, stdin)) {
    fprintf(stderr, "BUFFER is [%s]\n", buffer);   /* <==== */
    if ((strcasecmp(buffer,"a")) == 0) {
        aMethod();
        }
    if ((strcasecmp(buffer, "b")) == 0) {
        bMethod();
        }
    }
}

您这样做会发现很多错误。

1
在调试打印字符串时,将其包装在某些分隔符中(例如方括号),总是一个好主意,因为这将更清楚地显示字符串中包含的空格。 - Lubomír Sedlář

0

你忘记了 fgets 会将 \n 字符读入缓冲区。使用一个很酷的函数 strcspn() 来去掉它,这个函数在 string.h 中。在 if 语句之前添加以下代码:

buffer[strcspn(buffer,"\n")] = 0;

或者,您可以使用熟悉的strlen()函数:

size_t len = strlen(buffer);

if(len > 0 && buffer[len-1] == '\n')
    buffer[len-1] = 0;

抱歉,我对C语言还不太熟悉。所以strcspn函数的意思是从缓冲区到\n的长度为零吗? - Skillsguy
它计算第二个参数之前的字符数。在您的情况下,它计算到\n为止的字符数。如果找不到\n,则返回到\0的字符数,即字符串的长度(strlen(buffer))。 - Spikatrix

0

你忘记了 fgets() 函数会将换行符留在缓冲区中(除非输入的行长度过长)。因此,无法将输入的字符串与你进行比较的字符串之一相等。

此外,在标准 C 中并不存在叫做 strcasecmp() 的函数。这是一个 POSIX 函数。


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