scanf在其执行点之前工作

我尝试了一个简单的程序..函数返回整数和字符指针。在我运行该代码后,我发现一些奇怪的行为由scanf ..我试图打印消息(输入a,b :)读取两个整数输入和消息(输入c ,d :)读取两个char输入。但是在运行时..我发现char c的输入在我输入a,b …的输入后立即读取,例如:输入a,b:10 20输入c,d :g只得到一个输入(对于d),c的输入是20之后的换行符 ,例如2:输入a,b:10 20a输入c,d:g它只得到一个输入(对于d)和输入c是20后…为什么会发生这种情况……请澄清一下

int* add(int *a,int *b) { return (*a>*b?a:b); } char* charret(char *c,char *d) { return (*c>*d?c:d); } int main() { int a,b; char c,d; printf("\n\t\tFUNCTION RETURNING INTEGER POINTER\n\t"); printf("Enter the Number A and B:"); scanf("%d %d",&a,&b); printf("\tEnter the character c :"); scanf("%c %c",&c,&d); printf("The Biggestt Value is : %d\n\t",*add(&a,&b)); printf("\n\tThe character c= %c hi d= %c",c,d); // scanf("%c",&d); printf("\n\tThe Biggestt Value is : %c", *charret(&c,&d)); getch(); return 0; } 

%c将读取任何字符,包括上一个条目中的换行符。 如果要读取第一个非空白字符,请在格式字符串中的%c之前添加一个空格:

  scanf(" %c %c",&c,&d); /* ^ added space */ 

这将导致scanf()在读取字符之前吃掉任意数量的空格。

对于大多数scanf()说明符,将跳过任何前导空格。 %c是一个例外,因为它读取单个字符值,包括空格字符。 请记住,当您按Enter键时 ,您已向输入缓冲区发送了'\n'

scanf(“%d%d”,&a,&b);

读两个数字。 最后的\n ,按Enter键 ,将保留在缓冲区中。

scanf(“%c%c”,&c,&d);

读取两个字符,第一个字符将是缓冲区中的\n左侧。 解决这个问题的一种方法是:

while(getch()!=’\ n’);

这将吃掉包括换行符在内的所有内容。 你可以把它放在你知道的scanf()行后面留下换行符。