嵌入式学习日记(八)

来源:互联网 发布:linux 配置反向dns 编辑:程序博客网 时间:2024/06/06 19:22

2017-07-15

今日是学习嵌入式的第八天。


今天老师给我们布置了八道题目,为了让同学们更熟练的使用前面内容。在这里我就不把代码发出来了,而是来探讨一个编程中所遇到的问题。


请看以下代码

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <time.h>void fun();int main(){  fun();  return 0;}void fun(){  int n,i;  srand(time(NULL));  printf("please input n:");  scanf("%d",&n);  for(i=0;i<n;i++)  {    printf("%d   ",rand()%32+1);    sleep(1);  }  putchar(10);}


  此段代码试图在n秒内输出n个1~32的随机数,要达到每秒一个的效果。可是在我运行的过程中发现,并没有达到理想的效果!而是,在n秒后直接输出了n个随机数!(效果请感兴趣的各位自测)




  我想会不会是printf太low了,于是又有了下面的代码(将以上for循环中改写,用fprintf将字符串直接放入stdout中)

  for(i=0;i<n;i++)  {    fprintf(stdout,"%d  ",rand()%32+1);    sleep(1);  }

  然而,结果很尴尬。还是那样。




  在我很多次尝试后,突然有一次发现实现了间隔一秒的效果!代码如下:

  for(i=0;i<n;i++)  {    sleep(1);    fprintf(stdout,"%d\n",rand()%32+1);  }

  怎么换成换行就输出了呢?让我有一丝想法:可能与缓冲区有关。




  经过我的一番考察发现,果然是因为只是将想要输出的东西放在了stdout缓冲区中,并没有真正的输出!解决方法也很简单,只用手动的清空缓冲区就行了。代码如下:

  for(i=0;i<n;i++)  {    sleep(1);    fprintf(stdout,"%d\n",rand()%32+1);    fflush(stdout);  }

  fflush(stdout)有清空缓冲区的作用。这样就能完成最初想要的效果了!




  幸福总是短暂的,这次的问题解决了获得短暂的成就感,然而,之后的问题又在何处呢?期待挑战!——Fun_Peanut.

原创粉丝点击