鱼C论坛

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

scanf与getchar

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

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

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

x
  1. #include "stdio.h"
  2. main(){
  3.         float x,y;
  4.         int c=1;
  5.         while(c!=EOF){
  6.         printf("请输入x,输入‘ctrl+c’结束\n");
  7.         scanf("%f",&x);
  8.         if (x<1.0){
  9.                 printf("x的值为%f,x<1\n",x);
  10.                 y=x;}
  11.         else if(1.0<=x &&x<10.0){
  12.                 printf("x的值为%f,1<=x<10\n",x);
  13.                 y=2*x+1;}
  14.         else if(10.0<=x){
  15.                 printf("x的值为%f,x>=10\n",x);
  16.                 y=3*x-8;}
  17.         printf("y的取值为%3.2f\n",y);
  18.         c=getchar();
  19.         printf("%d",c);
  20.         }
  21. }
复制代码

代码如上,为什么我输入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-6-3 16:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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