4

以下代码在我运行时会产生一个非常奇怪的结果。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    for ( ; ; )
    {
         char test;
         printf("Please enter 'w' ");
         scanf("%c", &test);
         printf("%c\n", test);
         if (test == 'w')
         {
              printf("Working\n");
         }
         else
         {
              printf("ERROR\n");
              return 0;
         }
     }
}

我想要发生的是每当我输入'w'时它会继续循环,这样我就可以再次输入'w'。尽管我输入了“w”,但它的作用是转到 else 语句。它似乎只是跳过了这scanf()条线。我问过我认识的每个知道 C 但他们不知道如何解决它的人。

有人请在这里帮助我!

4

4 回答 4

10

这是因为您键入w后跟ENTER. 所以输入中有 2 个字符,'w',后跟换行符 ( \n)。后者导致else在第二次迭代中采用分支。

请注意,标准输入在连接到终端时是行缓冲的。如果您需要立即处理角色,有办法做到这一点。有关详细信息,请参阅comp.lang.c 常见问题解答(“如何在不等待 RETURN 键的情况下从键盘读取单个字符?如何阻止字符在键入时在屏幕上回显?”)。

请注意,对于健壮的编程,必须检查scanf. 它返回成功转换的项目数。如图所示,您的代码没有正确处理文件结束的情况,即当用户键入时Ctrl-D(假设是 Unix 终端)。然后 scanf 返回EOF并且没有执行任何转换,但是您使用test它时好像它包含一个有意义的值。

于 2013-05-30T10:21:23.927 回答
2

正如詹斯所说。你必须忽略换行符'\n'

在格式说明符的开头添加空格" %c"将忽略换行符'\n'

scanf(" %c", &test);

使用" %c"也会忽略其他空格,如\t space \b \v \r

于 2013-05-30T10:36:30.640 回答
1

正如 Jens 所说,你必须先消费'\n'getchar()然后再使用scanf()

于 2013-05-30T10:26:52.287 回答
0

你需要做类似的事情

     scanf("%c", &test);
     while(getchar()!='\n');

scanf将输入输入到空间或\n(以先到者为准)并将其留\n在缓冲区中

于 2013-05-30T10:35:51.993 回答