首页 > 解决方案 > printf("请输入'a':"); 第一次循环后运行 2 次

问题描述

int main (int argc, char *argv [])
{
     char a = 'v';

     for (int i = 0; a != 'x'; ) 
     {        
         printf("Enter 'a' : "); 
         scanf("%c",&a);
     }

     return 0;
}

我运行它并输入k。当我在此之后按 enter 时,为什么我在循环第二次运行时printf运行了2次?

标签: ccharprintfscanf

解决方案


为了理解这种行为,我们可以逐步模拟执行。

printf("Enter 'a' : "); 
scanf("%c",&a); // User type in example 'a' and presses enter.

scanf“缓冲”a\n并放入a值中'a'

不满足循环条件,因为'a' == 'x'false

printf("Enter 'a' : ");
scanf("%c",&a); // The buffer still contains `'\n'`

由于缓冲区仍然包含未使用的数据,因此将下一个字符 ( '\n') 放入a其中并继续循环。

不满足循环条件,因为'\n' == 'x'false

printf("Enter 'a' : ");
scanf("%c",&a); // The buffer is empty now.

这给了您循环显示两倍的错觉printf,但实际上,在scanf不需要用户输入的情况下不断读取缓冲区。

如果输入更多字符,例如qwerty"Enter 'a' : "将显示 7 次,因为"qwerty"包含 6 个字符 +'\n'


请注意,使用while (a != 'x')将比您更适合您的需求for (int i = 0; a != 'x'; )


推荐阅读