2016-03-02 15 views
1

我感到困惑如何scanf的和的getchar手柄流不同,下面是一个示例代码:scanf和getchar处理流的方式不同吗?

while(scanf("%d", &input) != 1) 
{ 
    while((ch = getchar()) != '\n') 
    { 
     putchar(ch); 
    } 
    printf("\nThis is wrong\n"); 
} 

printf("That is right\n"); 

它是用于测试是否输入是整数一个简单的程序。内部while循环用于在单击Enter之前显示每个错误的输入值。当我输入一个随机字符串如:

qwert 

putchar将打印出确切的字符串。但是,如果我换成

while(scanf("%d", &input) != 1) 

while((ch = getchar()) != '\n') 

,并打印出完全相同的字符串,第一个字母“Q”被退学了。 所以我的问题是如何scanf和getchar在外部循环处理这种情况不同?

+2

外环中的'getchar'吃掉了'q'。在内部循环之前添加'putchar(ch)'来解决问题。另一方面,对于无效输入(例如字符),'scanf(“%d”)'将失败,并返回0,并将字符(无效输入)留在stdin中。 –

回答

6

当您使用scanf尝试读取一个整数,你给一些输入是一个整数,然后scanf将失败,并不会返回1。然而,它会保持输入完整,它不会从输入中提取任何内容,只会让内部循环消化和打印。

如果您在外环使用getchar,它实际上将消耗一个字符,不管它是什么字符,然后内循环就不会看到这个角色,因为它不输入缓冲区存在了。

相关问题