小剑剑 发表于 2016-4-9 11:39:56

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的值呢?

GeekDream 发表于 2016-4-9 19:09:22

非法输入,并没有改变x的值,你可以通过接受打印scanf()函数的返回值测试。
scanf()函数的返回值是正确接收数据的个数,非法输入返回 -1。

mingcxx 发表于 2016-4-9 19:51:36

注意一下:输入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:57

谢谢了

mingcxx 发表于 2016-4-9 20:35:36

小剑剑 发表于 2016-4-9 20:26
谢谢了

{:5_109:}没事没事

xls6688 发表于 2016-4-10 05:22:36

看看{:5_92:}

我叫淳子 发表于 2016-4-15 13:19:55

scanf可以输入指定类型的一个数据, getchar输入的则是一个char型的数据。
页: [1]
查看完整版本: scanf与getchar