博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
当scanf接收单字符遇上循环
阅读量:6594 次
发布时间:2019-06-24

本文共 1174 字,大约阅读时间需要 3 分钟。

    ╮(╯▽╰)╭,没想到有一天自己也能就某个标准库函数,谈谈它的某个缺陷。

     但我了解,只要有了这开始,“想必是极好的”。

     这个问题是之前在写一个数据结构的程序时遇到的。现在简化了一下,与大家分享,

     一直挺赞同这句话的“Talk is cheap,show me the code”。

     So 代码来了。

     下面的代码是有问题的,就是scanf在循环第二次的时候,“%c”接收到的数据不是我们输入的数据,而是换行符。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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;
}
1
下面是运行结果:

  


结果分析:

   假如单从结果来分析,需要一些经验。

   对于第二辆车的数值“-858993460”这种数值,是数据未初始化的表现。也就是说,for循环中木有给我们的第二辆车进行相应的赋值。问题出现在第一个for循环之后。

开始调试

断点:我们将断点下载第一个for循环“printf”、“scanf”这两条语句上。


一、我们先来看看它们的初始值,


第一个循环的结果:正确赋值


第二个循环开始出现问题了,可以看到op的值为0x0a,这个ascii码对应是换行符。第二辆的车Car[1].carnum以及Car[1].time都没有被赋值。


之前查了点资料,好像没有谈到这个问题的成因。

有些人会说scanf会有很多问题,使用getchar或者getch,但我程序的要求需要从键盘接受多个数据。所以选择了scanf。

怎样去解决?

解决的办法是在需要接受单字符的格式字符“%c”前面加上一个空格。

输出结果:

可以看到这个赋值成功,所以输出也如我们所想


    这个问题的解决是得益于朋友的帮助,他说看过一个视频讲到这个问题。

    一个大牛专门写了一篇文章来将这个scanf的陷阱

本文转自 qq414207614 51CTO博客,原文链接:http://blog.51cto.com/skytina/1429115,如需转载请自行联系原作者
你可能感兴趣的文章
extjs_02_grid(显示本地数据,显示跨域数据)
查看>>
超过响应缓冲区限制
查看>>
ubuntu 下安装 matplotlib
查看>>
webservice的几个简单概念
查看>>
spring Transaction Management --官方
查看>>
html5 canvas 奇怪的形状垂直渐变
查看>>
mac java环境
查看>>
SQL Server 2008 收缩日志(log)文件
查看>>
UICollectionView基础
查看>>
BZOJ2794 : [Poi2012]Cloakroom
查看>>
正确计算linux系统内存使用率
查看>>
[转载]SpringMVC的Model参数绑定方式
查看>>
Linux socket多进程服务器框架三
查看>>
Debug.print的用法
查看>>
常用名词
查看>>
第一百三十四节,JavaScript,封装库--遮罩锁屏
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-新增锁定用户与解除锁定用户的功能...
查看>>
vue1.0 的过滤器
查看>>
EventCache表太大, 怎么办?
查看>>
Top 10 mistakes in Eclipse Plug-in Development
查看>>