scanf与getchar
#include "stdio.h"main(){
float x,y;
int c=1;
while(c!=EOF){
printf("请输入x,输入‘ctrl+c’结束\n");
scanf("%f",&x);
if (x<1.0){
printf("x的值为%f,x<1\n",x);
y=x;}
else if(1.0<=x &&x<10.0){
printf("x的值为%f,1<=x<10\n",x);
y=2*x+1;}
else if(10.0<=x){
printf("x的值为%f,x>=10\n",x);
y=3*x-8;}
printf("y的取值为%3.2f\n",y);
c=getchar();
printf("%d",c);
}
}
代码如上,为什么我输入ctrl+z时程序还输出6而不是ctrl+z的值呢? 非法输入,并没有改变x的值,你可以通过接受打印scanf()函数的返回值测试。
scanf()函数的返回值是正确接收数据的个数,非法输入返回 -1。 注意一下:输入6之后,程序反馈信息,同时还输出了一个10(这是换行符的ANSCII值)
问题原因:
scanf(): 从输入队列扫描输入,跳过空白字符(换行符、制表符、空格符等)
getchar():从输入队列读取单个字符(任意字符)
调试运行:
while条件为真,执行循环体,直到scanf()等待输入,
用户输入数字,回车确定(scanf()开始工作),
scanf()从输入队列获取一个浮点数,并跳过换行符,现在输入队列剩一个换行符,
getchar()从当前的输入队列里读取第一个字符,换行符被顺利读取,下一句printf()打印换行符的ANSCII值
回到循环首,条件“c != EOF”为真(换行符ANSCII值为10),开始第二次循环,
scanf()等待输入,键入ctrl+z,scanf()读取浮点数失败(ctrl+z是特殊的非打印字符,也是PC机模仿文件尾信号的组合键),x值没有更改
然后反馈用户x的值还是先前的值(还有y也是),
getchar()再次等待读取字符......
解决办法:
第18行的“c=getchar();”语句写2次,第一次获取scanf()遗漏的换行符,第二次等待用户输入一个字符(第19行的printf(),感觉多余,去掉也好,随意),一旦接收到文件尾信号,退出循环,结束程序。
这个是我这段时间学的一点C,也许有错,大家指点! 谢谢了 小剑剑 发表于 2016-4-9 20:26
谢谢了
{:5_109:}没事没事 看看{:5_92:} scanf可以输入指定类型的一个数据, getchar输入的则是一个char型的数据。
页:
[1]