c语言scanf后面不执行,c语言为什么scanf直接跳过去了
在的第一篇博文中
最近学习C语言遇到一个问题,就是在运行scanf函数的时候什么都不做。结果它直接跳过了我输入的数据。代码如下:
#包含stdio.h
int main()
{
int a;char c;
scanf(%d ,
scanf(%c ,
printf(%d %c ,a,c);
返回0;
}
按照我原来的设想,程序运行后,我会在键盘上输入一个数字0,再输入一个字符A然后回车。结果应该如下图所示。
但实际上我在键盘上输入了一个数字0,输入后直接变成了如下图所示。没有进入第二个scanf功能,程序结束。
经过调试,我发现程序结束后实际执行了第二个scanf函数,符号变量C的值从 \ 000 (ASCII值为 \ 000 为10)变成了 \ n (ASCII值为10),如下图所示。
经过查阅,我终于发现出现这种现象是因为我们在使用scanf进行数据类型化时,数据并不是直接赋给变量,而是先存储在一个缓冲区中。当我们按下回车键时,我们从缓冲区读取数据,并将其分配给变量。当我们使用scanf函数时,按回车键会自动生成一个换行符 \ n (这就是为什么当我们使用scanf输入数据时,按回车键会自动换行)。这个换行符
当我们执行第一个scanf的时候,没有影响,但是当我们执行第二个scanf函数的时候,我们会在按enter键之后,在缓冲区中读取前一个scanf函数生成的 \ n ,然后赋给变量C,直接跳过我们第二个数据输入的过程,所以我们可以看到最后会有一个换行符。
我觉得 \ n 是用单引号括起来的字符,在格式上和我们定义的变量C数据类型一样属于单个字符,所以会被误读,因为我发现如果第二条scanf语句的输入数据的数据类型是整数、字符串或者浮点,就不会出现这种现象。
具体解决方案:
1.将第二个scanf语句改为scanf ("%c "),并在%c前面键入一个空格,如下所示。
#包含stdio.h
int main()
{
int a;char c;
scanf(%d ,
scanf( %c ,
printf(%d %c ,a,c);
返回0;
}
2.将getchar语句添加到第一个scanf语句的下一行,以消耗换行符,如下所示。
#包含stdio.h
int main()
{
int a;char c;
scanf(%d ,
getchar();
scanf(%c ,
printf(%d %c ,a,c);
返回0;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。