如果我尝试以下内容:
int anint;
char achar;
printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);
它允许输入一个整数,然后完全跳过第二个scanf
,这真的很奇怪,就像当我交换两个(char
scanf first)时,它工作正常。究竟是什么错?
答案 0 :(得分:25)
使用scanf
读取输入时,按下返回键后会读取输入,但返回键生成的换行不会被scanf
消耗,这意味着下次读取{{来自标准输入的{1}}将有一个准备好读取的换行符。
要避免的一种方法是使用char
将输入作为字符串读取,然后使用fgets
提取您想要的内容:
sscanf
使用换行符的另一种方法是char line[MAX];
printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 )
anint=0;
printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 )
achar=0;
。 scanf("%c%*c",&anint);
将从缓冲区中读取换行符并将其丢弃。
您可能想要阅读此内容:
答案 1 :(得分:14)
其他答案都是正确的 - %c
不会跳过空格。最简单的方法是在%c
:
scanf(" %c", &achar);
(格式字符串中的任何空格都会使scanf
消耗所有连续的空格。)
答案 2 :(得分:5)
它不会跳过第二个scanf()
;第二个scanf()
读取第一个scanf()
留下的换行符。大多数格式代码跳过空格; %c
格式不会跳过空格。
答案 3 :(得分:0)
在每次printf调用后尝试_flushall()。 。基本上,默认情况下,MS的C ++缓冲流输出,并且刷新导致输出流为空。
答案 4 :(得分:0)
在getchar()
之前调用scanf
也会清除存储的换行符。更轻巧但更具情境性
char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);
将刷新换行符,在连续的代码行中更有用,你知道它只有一个排队值而不是字符串