当scanf接收单字符遇上循环
2014-06-20 22:08
246 查看
╮(╯▽╰)╭,没想到有一天自己也能就某个标准库函数,谈谈它的某个缺陷。
但我了解,只要有了这开始,“想必是极好的”。
这个问题是之前在写一个数据结构的程序时遇到的。现在简化了一下,与大家分享,
一直挺赞同这句话的“Talk is cheap,show me the code”。
So 代码来了。
下面的代码是有问题的,就是scanf在循环第二次的时候,“%c”接收到的数据不是我们输入的数据,而是换行符。
结果分析:
假如单从结果来分析,需要一些经验。
对于第二辆车的数值“-858993460”这种数值,是数据未初始化的表现。也就是说,for循环中木有给我们的第二辆车进行相应的赋值。问题出现在第一个for循环之后。
开始调试:
断点:我们将断点下载第一个for循环“printf”、“scanf”这两条语句上。
一、我们先来看看它们的初始值,
第一个循环的结果:正确赋值
第二个循环开始出现问题了,可以看到op的值为0x0a,这个ascii码对应是换行符。第二辆的车Car[1].carnum以及Car[1].time都没有被赋值。
之前查了点资料,好像没有谈到这个问题的成因。
有些人会说scanf会有很多问题,使用getchar或者getch,但我程序的要求需要从键盘接受多个数据。所以选择了scanf。
怎样去解决?
解决的办法是在需要接受单字符的格式字符“%c”前面加上一个空格。
输出结果:
可以看到这个赋值成功,所以输出也如我们所想
这个问题的解决是得益于朋友的帮助,他说看过一个视频讲到这个问题。
一个大牛专门写了一篇文章来将这个scanf的陷阱
本文出自 “且行且欣赏” 博客,请务必保留此出处http://skytina.blog.51cto.com/6834539/1429115
但我了解,只要有了这开始,“想必是极好的”。
这个问题是之前在写一个数据结构的程序时遇到的。现在简化了一下,与大家分享,
一直挺赞同这句话的“Talk is cheap,show me the code”。
So 代码来了。
下面的代码是有问题的,就是scanf在循环第二次的时候,“%c”接收到的数据不是我们输入的数据,而是换行符。
#include <stdio.h> struct CarInfo { int carnum; int time; }; int main(int argc, _TCHAR* argv[]) { char op; struct CarInfo Car[2]; int i=0; for(;i<2;i++) { printf("\n请输入操作,车牌,时刻:"); scanf("%c,%d,%d",&op,&Car[i].carnum,&Car[i].time); } for (int j=0;j<2;j++) { printf("%d\t%d\n",Car[j].carnum,Car[j].time); } return 0; }
下面是运行结果:
结果分析:
假如单从结果来分析,需要一些经验。
对于第二辆车的数值“-858993460”这种数值,是数据未初始化的表现。也就是说,for循环中木有给我们的第二辆车进行相应的赋值。问题出现在第一个for循环之后。
开始调试:
断点:我们将断点下载第一个for循环“printf”、“scanf”这两条语句上。
一、我们先来看看它们的初始值,
第一个循环的结果:正确赋值
第二个循环开始出现问题了,可以看到op的值为0x0a,这个ascii码对应是换行符。第二辆的车Car[1].carnum以及Car[1].time都没有被赋值。
之前查了点资料,好像没有谈到这个问题的成因。
有些人会说scanf会有很多问题,使用getchar或者getch,但我程序的要求需要从键盘接受多个数据。所以选择了scanf。
怎样去解决?
解决的办法是在需要接受单字符的格式字符“%c”前面加上一个空格。
输出结果:
可以看到这个赋值成功,所以输出也如我们所想
这个问题的解决是得益于朋友的帮助,他说看过一个视频讲到这个问题。
一个大牛专门写了一篇文章来将这个scanf的陷阱
本文出自 “且行且欣赏” 博客,请务必保留此出处http://skytina.blog.51cto.com/6834539/1429115
相关文章推荐
- 如何使scanf接收空格字符?
- scanf遇上循环输入会出错,试试下面的格式
- Java循环查找商品信息,最后接收字符n退出查找.主要是接收字符n
- for循环中scanf字符方法
- 【C语言基础】一直接收键盘字符 (while 循环,if条件语句)
- scanf("%c", &c);这句不能正常接收字符的原因。(附strindex的实现程序)
- 【bug笔记】scanf不停下来接收输入陷入死循环 fflush(stdin)与其他读取缓冲区字符的方法
- 解决scanf接收多余回车字符问题--清空缓冲区
- C语言 scanf在while循环里的无限循环
- ServerSocket和Socket建立通信(服务器和客户端循环接收发送)
- 切记scanf再输入字符的时候遇到空格是认为结束的,若有空格请用gets输入
- php socket接受大数据死循环,接收不全的问题
- smarty模板相关(字符截取、循环)
- [VB.NET]串口接收过程中怎样将末尾3位字符数据去掉?
- 编写一个程序,可以一直接收键盘字符,如果是小写字符就输出对应的大写字符,如果接收的是大写字符,就输出对应的小写字符,如果是数字不输出。
- scanf() 输入单个字符屏蔽回车符的四种解决方法
- 循环拆分带有字符的字符串
- 从键盘接收字符并输出对应大写或小写
- scanf和cin输入类型不匹配时造成的死循环问题
- 把一个字符串循环左移n个字符