2010-09-19 80 views
19

如果我尝试的东西,如:简单的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函数)交换两个,它工作正常。究竟什么是错的?

+1

你的指针有错误的大小,ANINT是这只是一个排队值而不是字符串比较有用char和achar是一个int。不要这样做。 – 2010-09-19 06:44:10

+0

@Variable Length Coder:对此我感到抱歉,只是解释了一个更简单的例子,并混合到了两个。那个错误与我的问题无关,修正了这个例子。 – John 2010-09-19 06:44:48

回答

22

当读取使用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 : Why does everyone say not to use scanf?

+1

你需要'%d'格式后面的'%* c'(或者相反),不是吗?虽然这是不可靠的 - 如果用户在数字之后和换行符之前键入空格或其他内容。我认为'fgets()'+'sscanf()'更好。 – 2010-09-19 06:47:55

+3

@Jonathan:你说得对。在'%d'之后我们需要它。是的'fgets + sscanf'总是更好。 – codaddict 2010-09-19 06:52:43

+0

@codeaddict:对于冗长的接受感到抱歉,但是您确实给了我更多的关于内部工作的深入见解。我真的很感谢C FAQ链接,如果我能够更好地教新朋友这些事情是明智的以后会帮助别人。 – John 2010-09-29 01:49:38

5

它不会跳过第二个scanf();第二个scanf()读取第一个scanf()留下的换行符。大多数格式代码跳过白色空间; %c格式不会跳过空格。

12

其他的答案是正确的 - %c不跳过空白。让它这样做最简单的方法是%c前放置空白:

scanf(" %c", &achar); 

(格式字符串中的任何空白将使scanf消耗所有连续的空格)。

+0

如何跳过空白有助于放弃换行符?例如:'scanf(“\ n%c”,&achar);'也可以。 – cpx 2012-12-15 17:29:02

+2

@cpx:因为换行符是空格。格式字符串中的任何空格的行为与其他任何空白字符相同,因此'\ n'与空格一样好(但又多了一个字母)。 – caf 2012-12-15 22:29:28

0

在每次printf调用之后,还要尝试_flushall()。 。基本上,默认情况下MS的C++缓冲流输出,并且刷新导致输出流为空。

0

调用getchar()之前scanf也将清除存储的换行符。更轻盈更态势

char input_1; 
char input_2; 
getchar(); 
scanf("%c", &input_1); 
getchar(); 
scanf("%c", &input_2); 

将刷新换行符,在代码的连续行,你知道