2013-07-03 89 views
0

参加在线C套餐,我这样做是为了的家庭作业问题之一时,我就应该把它不起作用。它应该提示用户输入半径,然后进行计算并打印出答案。它所做的是什么都不打印出来,但是执行得很好,当我输入一个数字时,那么它会打印出提示以及答案。解释为什么这将无法正常工作的C代码

基本上,为什么不会它的提示做输入第一,因为它是写在代码:

int main(void) 
{ 
    float volume, radius; 
    printf("Enter the radius of the sphere: \n"); 
    scanf("%f", &radius); 
    volume = (4.0f/3.0f) * 3.14f * radius * radius * radius; 
    printf("%.2f", volume); 
    return 0; 
} 
+6

提示我。你的环境是什么?另外,你应该'#include '。 –

+0

用MSVC提示我。 – JBL

+0

可能重复的[从标准输入刷新stdout吗?](http://stackoverflow.com/questions/2123528/does-reading-from-stdin-flush-stdout)(该问题涉及输出没有尾随'\ n' ,但答案讨论(...)的意义...) –

回答

8

你的代码工作我的Visual Studio 2010下和在Linux/GCC不如预期,与#include <stdio.h>在开始。但是,我不知道你的开发环境是什么。

试试你的第一printf后插入一个fflush(stdout);


这种行为与Eclipse相似(请参阅https://bugs.eclipse.org/bugs/show_bug.cgi?id=173732)。

Eclipse的CTD developper安东Leherbauer这里给出了一些解释:

的问题是:Eclipse控制台不是终端。在unix系统上, 方法的选择是创建一个伪终端(pty)并将子进程stdio连接到它。通过这种方式,子进程的行为与交互式终端中的方式完全相同 。 CDT完全适用于Linux,Mac OS X, Solaris和其他支持的平台。我们在Windows上没有Pty(或类似的东西 ),因此交互式控制台模式程序不会按预期工作 。 Eclipse无法刷新它不控制的缓冲区。 对“\ n”进行刷新会显示行缓冲模式,这在我试图解释的Windows上是不可能的。

+0

我使用MiniGW的EclipseC/C + + IDE,因为我也使用eclipse的Java和Android的东西。为了记录我有#include 我只是没有把它放在帖子中。在第一个printf之后加入fflush(stdout)就行了,但为什么我需要这条线呢?我的书甚至没有提到,有人可以帮助解释为什么我需要fflush才能在Eclipse中正常工作? –

+0

通常,stdout是_line-buffered_,所以使用'printf()'输出的任何内容都可以(但不一定是_will_)位于输出缓冲区中,直到您打印换行符('\ n'')刷新并显示给用户。但是,当输出通道是流水线的一部分而不是直接连接到您的终端时,标准输出通常会被缓冲_,因此即使您打印以换行符结尾的字符串,它也不一定对任何读取输出,直到程序填充输出缓冲区,输出缓冲区可以是任何大小,但通常为 –

+0

,其大小在512字节到2千字节之间。当然,解决这个问题的方法是'fflush()'函数,即使你没有打印新行,或者打印了2千字节的数据,也会强制刷新输出缓冲区。现在,我不知道这个,但考虑到你描述的行为,我推测当你在eclipse中运行你的程序时,它会在管道中运行你的程序,以便它能够为你输出输出,并且这导致你的标准输出被完全缓冲而不是行缓冲。 –

相关问题