C scanf(“%c”)的问题是逐个读取字符的功能

时间:2013-05-30 10:17:02

标签: c scanf

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

#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,但他们不知道如何解决它。

有人请帮助我!

5 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:2)

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

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

scanf(" %c", &test);

使用" %c"也会缩小其他空白位置,例如\t space \b \v \r

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您需要执行类似

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

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

答案 4 :(得分:0)

只是好奇你在Windows上试试吗? 你可以试试flushall();