• 关于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等等,一定要学会规避' '!这很重要,完善相关的函数!

  • 相关阅读:
    jQuery选择器
    jQuery属性
    复选框的全选+全不选+ajax传递复选框的value值+后台接受复选框默认值
    [BZOJ1085][SCOI2005]骑士精神 搜索
    [BZOJ1004][HNOI2008]Cards 群论+置换群+DP
    [BZOJ1046][HAOI2007]上升序列 DP+贪心
    [BZOJ1016][JSOI2008]最小生成树计数 最小生成树 搜索
    [BZOJ1031][JSOI2007]字符加密Cipher 后缀数组
    后缀数组学习笔记
    [SPOJ8222]NSUBSTR
  • 原文地址:https://www.cnblogs.com/uestc-mm/p/10516988.html
Copyright © 2020-2023  润新知