c - printf ("Enter ' a' : "); runs 2 times after 1st loop

标签 c char printf scanf

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

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

     return 0;
}

我运行了它并提供了输入 k。当我在此之后按回车键时,为什么我的 printf当循环运行第二次时运行 2 次

最佳答案

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

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

scanf "bufferize"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 - printf ("Enter ' a' : "); runs 2 times after 1st loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58080582/

相关文章:

c - 为什么在 .h 文件中声明一个变量会为每个包含它的 .c 文件分配内存,它是 ANSI C 吗?

c - fopen 和 fclose,跨函数传递文件

C++。将符号行读入字符数组/vector 的最快方法

c++ - Memcpy uint32_t 到 char*

java - 如何使用 Java 或 Groovy printf 向字符串添加千位分隔符

c - 关于带有 lf 说明符的 scanf() 和带有 lf 说明符的 printf() 的问题?

c - fprintf valgrind 错误

c - 错误 - void* - 未知大小

c - 这是什么意思? #define TIMER_PASTE_B(lft,t,rgt) lft##t##_##rgt

objective-c - 我为什么得到:从结果类型为char的函数返回const char *丢弃限定符