简单的C scanf不起作用?
如果我尝试以下内容:
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)时,它工作正常。 究竟是什么错了?
当使用scanf
读取输入时,在按下返回键后读取输入,但是返回键生成的换行不被scanf
消耗,这意味着下次从标准输入读取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);
。 %*c
将从缓冲区中读取换行符并将其丢弃。
你可能想读这个:
C FAQ:为什么每个人都说不使用scanf?
其他答案是正确的 – %c
不会跳过空格。 最简单的方法是在%c
之前放置空格:
scanf(" %c", &achar);
(格式字符串中的任何空格都会使scanf
消耗所有连续的空格)。
它没有跳过第二个scanf()
; 第二个scanf()
读取第一个scanf()
留下的换行符。 大多数格式代码跳过空格; %c
格式不会跳过空格。
每次printf调用后也请尝试使用_flushall()。 。 基本上,默认情况下,MS的C ++缓冲流输出,并且刷新导致输出流为空。
在scanf
之前调用getchar()
也会清除存储的换行符。 更轻巧但更具情境性
char input_1; char input_2; getchar(); scanf("%c", &input_1); getchar(); scanf("%c", &input_2);
将刷新换行符,在连续的代码行中更有用,你知道它只有一个排队值而不是字符串