scanf()输入格式不匹配

「已注销」 2019-08-19 10:32:58
scanf是格式化输入,意思是输入的值与所指定的类型不匹配就会读入失败吗?如图中所示,scanf(“%d”)我输入一个浮点数为何也能成功读入呢?我再输入一个c,为何读入的不是c的ascll码99呢?
...全文
477 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2019-08-20
  • 打赏
  • 举报
回复
引用 1 楼 Italink 的回复:
1.234被截断了,输入说白了就是输入一串字符,scanf只是根据格式控制符来处理这些字符,你输入1.234,按%d,整型读取到.时为非整型数字,所以直接截断,因此你缓冲区中还留有.234这几个字符
那请问为何我输入字符c,scanf为何读入的不是c的ascll码99,直接读取失败呢?
赵4老师 2019-08-20
  • 打赏
  • 举报
回复
printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方,而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
Italink 2019-08-20
  • 打赏
  • 举报
回复
1.234被截断了,输入说白了就是输入一串字符,scanf只是根据格式控制符来处理这些字符,你输入1.234,按%d,整型读取到.时为非整型数字,所以直接截断,因此你缓冲区中还留有.234这几个字符
  • 打赏
  • 举报
回复
你输入'c'不是数字啊。 你输入的数字2,是ASCII码0x32,不是数值,需要转换成数值,输入非数字的ASCII码,怎么转换呢?是未定义行为。
Italink 2019-08-20
  • 打赏
  • 举报
回复
引用 3 楼 子騫的回复:
引用 1 楼 Italink 的回复:
1.234被截断了,输入说白了就是输入一串字符,scanf只是根据格式控制符来处理这些字符,你输入1.234,按%d,整型读取到.时为非整型数字,所以直接截断,因此你缓冲区中还留有.234这几个字符
那请问为何我输入字符c,scanf为何读入的不是c的ascll码99,直接读取失败呢?
能读取1.234,是因为%d读取完1之后,读到.直接就截断了,而你输入字符c,c根本不是一个数字字符,所以无法输入,你不要觉得你输入1.234就是输入一个浮点类型,你所输入的,通通都是字符串,scanf只是把字符串通过格式控制符转化给变量,比如我入一个1,这个1不是int,不是double,它只是一个字符,懂这个意思吗?
赵4老师 2019-08-20
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。

69,374

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧