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

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

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

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

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

posted @ 2019-03-12 15:27  小淼博客  阅读(357)  评论(0编辑  收藏  举报

大家转载请注明出处!谢谢! 在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~