通过我搜索解决方案,我找到了question。 这让我思考并做了一些实验:
案例1
#include<stdio.h>
main()
{ char a;
//some code
scanf("%c",&a);
/*This code might not be evaluated(missed)
sometimes*/
//This is how it is solved
scanf(" %c",&a);
//the rest of code
}
案例2
#include<stdio.h>
main()
{ int a;
//some code
scanf(" %d ",&a);
//this one will take 2 numbers instead of one
//the rest of code
}
我对c语言知之甚少,所以如果有人向我解释这些结果,我将不胜感激。(如果重要的话,我正在使用turbo c ++。)
答案 0 :(得分:1)
一些一般性说明:
scanf()
可以在线获得大量文档。所以在你的第一个例子中,例子是:
char a, b;
scanf("%c", &a);
scanf("%c", &b); // this one will be "missed"
原因是当你在stdin
中输入一个角色时,你真正得到两个角色,输入的内容加上一个不可见的换行符('\n'
)。所以真的第二个scanf没有“错过”它只是拿起一个没有ASCII表示的字符。
如果你打印这些:
printf("%c %d\n%c%d\n", a, a, b, b);
你会看到:
>> ./my_prog
>> a
>> a 97
10
因为您输入了“a \ n”并且两个scanf首先读取“a”然后分别读取“\ n”。
使用带有空格的scanf:
scanf(" %c", &b); // this one will work instead
告诉scanf应忽略'\n'
上留下的任何空白字符(包括换行符stdin
)。
在你的第二种情况下,它不是在寻找2个数字,它正在寻找一个数字和一个空格字符。 scanf(" %d ", &a)
说“忽略任何空格,然后查找十进制数,然后查找空格”。但是,一旦变量(a)被填充,它就会停止读取,因为这就是scanf
的工作原理:
由一个或多个空格字符组成的指令应通过读取输入执行,直到无法读取更多有效输入,或者直到第一个不是空白字符的字节为止,该字符仍未读取的
所以它并不是真的在寻找另一个数字,你可以在这一点上键入任何东西,它会很高兴,因为它只是在寻找另一个空格字符来输入。所以这个:
scanf(" %d ", &a);
这个输入可以满足:
>> 5
f
首先,“%d”与5匹配,然后f后面的换行符与“”
匹配