这周根据上课群里一个同学提问的问/题,小皓进行了一些思考,下面是一些推理验证过程。
总结来了既帮助了别人也学习了新的知识。
#include <stdio.h>
int main()
{
int a,b;
float x,y;
char c1,c2;
printf("请输入a,b的值:\n");
scanf("%d%d",&a,&b);
printf("a=%d b=%d\n",a,b);
printf("请输入x,y的值:\n");
scanf("%f%e",&x,&y);
printf("x=%.1f y=%.2f\n",x,y);
printf("请输入c1,c2的值:\n");
scanf("%c,%c",&c1,&c2);
printf("c1=%c,c2=%c\n",c1,c2);
return 0;
}
这是最开始的代码,编译运行按格式输入后发现结果如下
很显然根据输出格式,第一个字符c1是被一个类似于回车的字符占用了,接下来的c2我觉得是没有按照字符,字符的格式输出所以c2也有没有输出任何字符
以回车举例我们这样输入,回车后只输入一个逗号继续回车试一下
很明显的发现下方空行多了一个,此时c2也按照字符,字符的格式输出了下一个类似于回车的字符
对此继续验证,我们这样输入,回车后直接,字符
发现按格式里的第二个c2成功输出,c1还是输出了一个类似于回车的字符
针对于这一点我举得是因为程序读取输入是从上到下的,我们进行第二项浮点输入时会习惯回车引出下一条printf,可能计算机也同时读取了我们的回车换行将它赋值给了c1
对此我对第二个浮点输出进行了一些改动,也符合我们的猜测,第一个字符被一个很像回车的东西占用了,从结果可知
中间我也对c1进行强制赋值加以验证,在回车换行后,为了按照字符,字符的格式,我并没有输入第一个c1,毕竟此时我们也似乎发现一些我们还不知道的东西,我直接输入,字符对c2赋值,同时我为c1赋值32,32对应的时space也就是我们常用的空格。结果显而易见,也是按照了我们的想法,只不过c1输出的时空格了
同时为了防止你们不理解,我进行了一次全输入字符,字符,因为没有按照scanf里的格式,我们无法对c2进行赋值,c2无法输出,目前只有c1被我们又强制赋值了
结果如下
结果也符合我i们的猜测
接着,我们这样输入试一下,直接在第二个浮点输出里面输入字符,字符试一下
我们发现这样完全符合了我们最开始的想法
我根据这个疑问去博客搜索了一下,发现了一个很生僻的字符——回车字符'\xA'
我们进行一下演示
把c1强制替换成字符'\xA',并且按照字符,字符
根据我们的猜测c2无法输出任何结果,c1会输出一个回车,这样,和最开始一模一样
由此,我们可以印证我们的猜测,我们的c1被回车字符占用了,又因为scanf里面是字符,字符的输入格式,c2无法读取赋值,c2无结果。如果把逗号换成空格或者其他的,结果也应该会符合我i们的猜测