2012-09-13 26 views
0

在我简单的程序,当它执行getchar方法之前printf方法执行。 为什么会发生这种情况,以及如何解决这个问题?的getchar()的printf之前执行()

#include <stdio.h> 
#include <stdlib.h> 

#define SUCCESS 0 

void exit_Pro() 
{ 
    printf("Press any Key to exit: "); 
    fflush(stdin); 
    getchar(); 
} 
int main(int argc, char **argv) { 
    atexit(exit_Pro); 

    return SUCCESS; 
} 

平台:窗口7 编译器(IDE):Eclipse的CDT

+6

永远不要调用'fflush(stdin)' - 它是UB - 见[man fflush](http://www.manpagez.com/man/3/fflush/)。 –

+7

是什么让你认为getchar在printf之前执行? printf首先执行,但你看不到输出,因为它是缓冲的。也许你的意思是'fflush(stdout)' –

+0

你的代码在我的系统上编译并运行正常。不知道你为什么认为有问题。当你在系统上看到输出时,stdout缓冲可能会延迟吗? –

回答

2

首先,我同意荒谬:fflush(stdin)是一件坏事。这里是further explanation。 (如果有经验的程序员都告诉我我做错了什么,我会相信他们的。)

现在,要尝试并帮助您调试代码,您能告诉我们这个简化代码是否展示了你系统上的同样问题?

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    printf("Press any Key to exit: "); 
    fflush(stdout); 
    getchar(); 
} 
+0

这工作正常,谢谢@ ron.rothman –

+0

但告诉如何'fflush'输入缓冲区或清除它? –

+0

'stdin'被设计缓冲。也许你可以阅读('fgets'),并简单地忽略你不想要的任何字符?这里有一些[进一步讨论](http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044873249&id=1043284392)和一种方法(虽然我只推荐保留)。祝你好运! –

3

冲洗 “标准输入”? printf在“stdout”上运行。你的意思是冲洗那个? Flushing“stdin”没有任何意义。

+0

真实 - 好点;但不是OP的问题的答案。 (并且在上面PaulR的评论中已经指出了。) –

+0

不,我认为这*是答案。 OP认为'getchar'由于没有输出而先执行,然后等待一个键,程序退出并刷新stdout。看起来'printf'正在发生,因为printf中没有换行符,并且'stdout'没有明确的刷新。 – paddy

+0

除了......在他上面的评论(19分钟前对WilliamPursell的回应)中,他非常清楚地说他尝试过并且没有成功。对? –

0

如果你使用stderr(这是无缓冲)?这个对我有用。

void exit_Pro() 
{ 
    fprintf(stderr, "Press any Key to exit: "); 
    getchar(); 
} 
+1

即使使用'stdout',它也适用于我。 –

+0

Sheesh。你是对的。谢谢。我无法重现原来的问题(Linux 3.4.6 x86_64,glibc 2.15,gcc 4.7.1)。 – LSerni

相关问题