c - 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次?
解决方案
为了理解这种行为,我们可以逐步模拟执行。
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'; )
推荐阅读
- c++ - 使用 deque 实例化 priority_queue 不会编译 - 使用 vector 可以。这是为什么?
- react-native - react-native 应用程序未在模拟器上启动
- javascript - 如何将图像转换为base64?
- javascript - 如何将 PHP 变量传递给 JavaScript,类似于 WordPress wp_localize_script 函数
- c - 区分 C 中的各种声明
- php - 超过最大发送速率。SMTP 454 错误
- django - 在 AWS ELB Django 应用程序中禁用运行状况检查日志记录
- python - 如何从 MacOS 卸载本地 python 包
- java - Java - 可调用构造函数覆盖变量
- java - 火花累加器值不递增