2012-12-02 125 views
2

在尝试调试某些C代码时,我发现如果放在无限循环之前,printf()将不会执行。有人知道为什么吗?实际上这不是什么大不了的事情,但对于调试来说这是一场噩梦。打印语句在无限循环之前不会打印

#include<stdio.h> 

int main() 
{ 
    int data; 

    printf("This prints fine.\n"); 

    printf("Enter data: "); 
    scanf("%d", &data); 

    printf("This should print but it doesn't.\n"); 

    while(1) 
    { 
    //Infinite Loop 
    } 

    return 0; 
} 
+3

试过? 'fflush(stdout)' – MarcDefiant

+0

是的,这是有效的。这里到底发生了什么? – amishjack

+3

我更喜欢将调试信息打印到stderr,它通常不会被缓冲。 –

回答

2

在调用printf()时,输出在程序终止或遇到换行符后显示。 但是由于您在printf()之后调用无限循环,程序不会终止,并且不会显示缓冲区中的输出。

使用fflush(stdout)迫使从缓冲器输出将被显示

stdout 标准输出数据流被输出的应用程序的默认目的地。在大多数系统中,它通常默认指向文本控制台(通常在屏幕上)。

fflush()功能使系统清空缓冲区

0

尝试__fpurge(标准输出),它会清除输出缓冲区

0

他们是一个叫的线缓冲器及缓冲块的概念。每个你想要写入屏幕的东西都会在缓冲区中。行缓冲器意味着当新行[\ n]发现它将“刷新缓冲区”时,意味着你的字符串将会在屏幕上打印,块缓冲器意味着它们将被固定为块大小,除非该块满了,否则不会打印在屏幕。在上面的情况下新行[\ n]足以打印