码迷,mamicode.com
首页 > 其他好文 > 详细

当scanf接收单字符遇上循环

时间:2014-06-21 19:39:19      阅读:349      评论:0      收藏:0      [点我收藏+]

标签:c语言   for循环   scanf陷阱   


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

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


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

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

 bubuko.com,布布扣


结果分析:

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

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


开始调试

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


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

bubuko.com,布布扣


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


bubuko.com,布布扣



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

bubuko.com,布布扣


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

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


怎样去解决?

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


bubuko.com,布布扣


输出结果:

bubuko.com,布布扣

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



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

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

本文出自 “且行且欣赏” 博客,请务必保留此出处http://skytina.blog.51cto.com/6834539/1429115

当scanf接收单字符遇上循环,布布扣,bubuko.com

当scanf接收单字符遇上循环

标签:c语言   for循环   scanf陷阱   

原文地址:http://skytina.blog.51cto.com/6834539/1429115

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!