zoukankan      html  css  js  c++  java
  • 关于getchar-scanf函数的相关坑!

    首先,我们编写如下所示的代码:

     1 #include <stdio.h>
     2 
     3 void test(int n)
     4 {
     5         static int a = 0;
     6         static int b = 0;
     7         static int c = 0;
     8 
     9         a = b;
    10         b = c;
    11         c = n;
    12         printf("a,b,c:%d,%d,%d
    ",a,b,c);
    13 }
    14 int main(int argc,char *argv[])
    15 {
    16         int in = 0;
    17         while(1)
    18         {
    19                 in = getchar()-48;
    20                 // if(in == -38) continue;
    21                 test(in);
    22         }
    23         return 0;
    24 }

    上述代码的运行结果如下所示:

    无论是scanf还是getchar等等,一定要学会规避' '!这很重要,完善相关的函数!

    Que问题:我们可以看到程序在运行到getchar的位置处,确实阻塞了,等待着我们的输入,但是我们发现我们的test函数中的printf执行了两次,这是为什么呢?

    首先来看一看输出的内容,我们输入了1,没问题,但是又出现了一个-38的值,那我们联想一下-38的ASIIC码值对应的字符是什么呢,正是我们的 ,回车键!也就是说,我们输入的回车键也被我们的系统读入到缓冲队列当中了,也就是说,当我们读取了数据之后,由于队列中还有一个回车键没读取,所以getchar继续读取缓冲中的回车键' ',这样test就会执行两次,同样的printf打印两次。

    Ans解决:我们可以通过在程序中加入第20行,这样我们就能规避掉缓冲中的' '了。那么有人问,能不能用setbuf(stdin,NULL),或者在getchar之后清空缓冲区呢?-fflush(stdin) 答案是不可行的,具体的讨论还需要思考为什么不可以!

    Con结论:无论是scanf还是getchar等等,一定要学会规避' '!这很重要,完善相关的函数!

  • 相关阅读:
    国庆后的星期一
    如何让百度快速收录文章
    牛大发了~美国12岁女孩自制"火箭"将Hello Kitty送上近太空
    免费CDN /初体验 访问量激升19%
    国外免费CDN CloudFlare申请教程
    Windows Azure Application申请方法
    坚持转自网易轻博客LOFTER
    玩转你的Gravatar全球通用头像
    IIS下配置WordPress永久链接支持中文完美方法
    常用的SqlHelper类
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/10516988.html
Copyright © 2011-2022 走看看