鱼C论坛

 找回密码
 立即注册
查看: 2274|回复: 6

scanf与getchar

[复制链接]
发表于 2016-4-9 11:39:56 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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的值呢?
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-9 19:09:22 | 显示全部楼层
非法输入,并没有改变x的值,你可以通过接受打印scanf()函数的返回值测试。
scanf()函数的返回值是正确接收数据的个数,非法输入返回 -1。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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,也许有错,大家指点!

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
TerryCW + 5 + 5 + 3 大神

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-4-9 20:26:57 | 显示全部楼层
谢谢了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-9 20:35:36 | 显示全部楼层

没事没事
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-10 05:22:36 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-15 13:19:55 | 显示全部楼层
scanf可以输入指定类型的一个数据, getchar输入的则是一个char型的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 02:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表