延缓输出
下面的代码是为了实现每隔一秒钟输出一个数字,
但是发现结果是等到最后一秒才输出所有要输出的数字;
- C/C++ code
#include<stdio.h>#include<time.h>void wait ( int seconds ){ clock_t endwait; endwait = clock () + seconds * CLOCKS_PER_SEC ; while (clock() < endwait) {}} int main(){ int i; for(i = 1; i< 10; i++) { printf(" %d ",i); //如果代码写成printf("%d\n", i);就可以每隔一秒输出一个数字,求其中的真理? wait(1); } return 0; }[解决办法]
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
[解决办法]
怎么在我电脑上就正常咧?
--------------------------------------
fflush用于清空缓冲流,虽然一般感觉不到,但是默认printf是缓冲输出的。
fflush(stdout),使stdout清空,就会立刻输出所有在缓冲区的内容。
fflush(stdout)这个例子可能不太明显,但对stdin很明显。
如下语句:
int a,c;
scanf("%d",&a);
getchar();
输入:
12(回车)
那么 a=12 ,c= '\n'
而:
int a,c;
scanf("%d",&a);
fflush(stdin);
getchar();
输入:
12(回车)
那么a=12, c暂时未得到输入值,还需要再输入c,因为getchar也是缓冲输入,'\n'本还在缓冲区,但是被清空了。
另外fflush不能作用于重定向输入流。
[解决办法]
代码从理论上来说是正确的,之所以出现那种情况,可能和你的机器有关(比如CPU的性能不够)。
- C/C++ code
#include <stdio.h>#include <Windows.h>//#include<time.h>//void wait ( int seconds ) // 这种延时方式,相当消耗CPU资源,实际中可不要这么做。//{// clock_t endwait;// endwait = clock () + seconds * CLOCKS_PER_SEC ;// while (clock() < endwait) {}//} int main(){ int i; for(i = 1; i< 10; i++) { printf(" %d ",i); //如果代码写成printf("%d\n", i);就可以每隔一秒输出一个数字,求其中的真理? //wait(1); Sleep(1000); // 如果是在Windows上,就用这个函数吧,Linux上也有类似的函数 } return 0; }
[解决办法]