当scanf接收单字符遇上循环

简介:

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

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


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

     一直挺赞同这句话的“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
下面是运行结果:

 wKiom1OkNFOjrDDDAAAcqikDrvE801.png 


结果分析:

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

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


开始调试

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


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

wKioL1OkNuTAOjMFAAA2q1X-gu4889.png


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


wKiom1OkNxPw_JRRAABOES2QG0E792.png



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

wKioL1OkNuiB4TxKAABdc25-aPg475.png


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

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


怎样去解决?

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


wKioL1OkPTvTzDb_AAAU4pQ95gU367.png


输出结果:

wKiom1OkQKLSGzJCAABTVXBSowU006.png

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



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

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










本文转自 qq414207614 51CTO博客,原文链接:http://blog.51cto.com/skytina/1429115,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
存储 C语言
在C语言中编写,用于从键盘接收输入的整数并判断该数是否能被3整除
在C语言中编写,用于从键盘接收输入的整数并判断该数是否能被3整除
21 0
|
4月前
|
C语言
C语言第二十八弹--输入一个非负整数,返回组成它的数字之和
C语言第二十八弹--输入一个非负整数,返回组成它的数字之和
【题目集1】找不重复的数字,模拟实现aoti,宏实现offsetof
【题目集1】找不重复的数字,模拟实现aoti,宏实现offsetof
|
7月前
顺序打印整型数字的每一位
顺序打印整型数字的每一位
31 0
|
9月前
学C的第三天(多组输入的一种方法;简单了解函数,数组,多种操作符)-2
10.2:移位操作符(移动的是二进制位): >>(右移) <<(左移) 10.3:位操作符(操作的额也是二进制位): &(按位与) ^(按位异或) |(按位或)
|
10月前
|
存储 机器学习/深度学习
母牛的故事 替换空格 二进制中1的个数 不使用第三个变量交换a,b的值
母牛的故事 替换空格 二进制中1的个数 不使用第三个变量交换a,b的值
64 0
|
10月前
|
Java Python
猜数字之循环判断
猜数字之循环判断
72 0