使用fflush加速代码以防止超出时间限制
如果标准输出未刷新,以下代码将获得 TLE(超出时间限制)。
#include<stdio.h>
int main(){
int a;
while(1){
scanf("%d",&a);
printf("%dn",a);
fflush(stdout);
if(a==42)
break;
}
return 0;
}
刷新输出缓冲区如何帮助克服 TLE?
这是问题链接 - https://www.spoj.com/problems/EXPECT/
回答
问题说明告诉你该怎么做:
注意:程序在打印每一行后应清除输出缓冲区。
可以使用 fflush(stdout) 命令或在执行开始时设置适当的缓冲类型 - setlinebuf(stdout) 来完成。
问题标题说明了原因:
(交互的)
评判软件以交互方式运行程序。在给程序一个输入之后,它在提供更多输入之前等待输出。当您的程序不刷新缓冲输出时,判断软件会一直等待,直到超过其时间限制。
通常,终端的输出流是行缓冲的,在这种情况下,打印换行符会导致它们被刷新。但是,这个判断软件很可能使用了一个完全缓冲的管道,因此在缓冲区满或您明确请求刷新(或者,在程序开始时,您将缓冲模式更改为无缓冲或行缓冲)。
当您刷新输出时,判断软件会看到它,然后它会继续并提供更多输入。
作为在 each 之后刷新输出的替代方法printf,您可以通过setvbuf(stdout, NULL, _IOLBF, 0);在程序开始时执行(在对流执行任何其他操作之前)将流设置为行缓冲模式。
- @AkashDahane: You can see the size of the buffer by running this program: `#include <stdio.h>` / `int main(void) { for (int i = 0; i < 16384; ++i) { fprintf(stderr, "%dn", i); putchar('*'); } }`. It writes one character at a time to `stdout`, after writing how many bytes it has written so far to `stderr`. Since the `stderr` output includes `n`, it will be flushed in each call. When the `stdout` buffer is full, it will be flushed and will appear immediately after the number of bytes that have been written to it. That number is the size of the buffer.