首先,我们编写如下所示的代码:
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等等,一定要学会规避' '!这很重要,完善相关的函数!