为什么scanf在字符input方面performance怪异?

/* Write macro for the following : 1. Arithmetic Mean of two no. 2. Absolute value of a no. 3. To convert a Uppercase letter to lower case. 4. To obtain bigger of two numbers. */ #include<stdio.h> #define am(a,b) ((a+b)/2) #define abs(a) (a>=0?a:-a) #define ul(ch) (ch>=65 && ch<=96 ? ch+32 : ch) #define bigger(a,b) (a>=b?a:b) int main () { int x,y; char c; printf("\nEnter two numbers:"); scanf("%d%d",&x,&y); printf("\nThe arithmetic mean of two numbers is %f",(float)am(x,y)); printf("\nEnter the number:"); scanf("%d",&x); printf("\nThe absolute value of the number is %d",abs(x)); printf("\nEnter the character:"); scanf("%c",&c); printf("\nThe letter in lower case is %c",ul(c)); printf("\nEnter two numbers:"); scanf("%d%d",&x,&y); printf("\nThe bigger of two numbers is %d",bigger(x,y)); return 0; } 

一切工作正常,除了程序不停止采取字符input。

这里是输出的快照….

  Enter two numbers:4 5 The arithmetic mean of two numbers is 4.000000 Enter the number:-7 **/*After hitting enter here it reaches line no. 7 */** The absolute value of the number is 7 Enter the character: The letter in lower case is Enter two numbers:4 **/*line no. 7*/** 6 The bigger of two numbers is 6 

Solutions Collecting From Web of "为什么scanf在字符input方面performance怪异?"

我相信这里的问题在于你的scanf(“%c”,&c)是在你输入-7时输入回车符。

把一个getchar(或另一个scanf(“%c”,&c))放在scanf之前,你不应该有这个问题。

这是因为%d跳过了空格,但是%c没有 – 换句话说。

%d会跳过输入流中正在进行的任何空白,而输入指针会在最后一个数字之后 – 这很可能是换行符。 所以当你来询问%c的时候,你实际上已经有了输入数据 – 那就是你的换行符 – 这就是你将要阅读的内容。

通过在%c之前插入一个空格来改变你的scanf,让它跳过空格

  scanf(" %c",&c); 

%c读取包括whitescape在内的任何字符,所以它会“吃”换行符。

使用: scanf(" %c",&c);

scanf的一个常见问题是,它不会消耗按Enter键导致的换行符。 我通常会在调用scanf之后使用下面的宏来解决这个问题

 #define consumeBuffer() while (getchar() != '\n'); 

当然,这并不总是你想要的,但是对于大多数情况来说,这是可以做到的。

这是因为在你的第一个scanf回车键仍然在输入缓冲器中,下一个scanf将把输入值存储在x 。 然后你的下一个printf将打印它 – 有效地移动到一个新的行。

要解决这个问题,你可以在每个scanf之后添加一个getchar()调用。