Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Cygwin上使用TCC编译_C_Terminal_Cygwin_Printf_Fgets - Fatal编程技术网

在Cygwin上使用TCC编译

在Cygwin上使用TCC编译,c,terminal,cygwin,printf,fgets,C,Terminal,Cygwin,Printf,Fgets,我正在测试一个用C编写的非常基本的程序,其全部内容附在下面。在尝试执行TCC生成的可执行文件时,我注意到在实际看到任何printf()调用的输出之前,需要为每个连续的fgets()输入输入 这非常令人困惑,所以我决定尝试在标准Windows控制台上运行可执行文件。它运行完美,输入和输出提示按正确的顺序显示 然而,我注意到,如果我用GCC编译程序,它将在用Cygwin编译的终端上正常工作(mintty,尽管我用rxvt得到了相同的结果) 有谁能解释一下为什么会发生这种情况,以及我怎样才能阻止它发生

我正在测试一个用C编写的非常基本的程序,其全部内容附在下面。在尝试执行TCC生成的可执行文件时,我注意到在实际看到任何printf()调用的输出之前,需要为每个连续的fgets()输入输入

这非常令人困惑,所以我决定尝试在标准Windows控制台上运行可执行文件。它运行完美,输入和输出提示按正确的顺序显示

然而,我注意到,如果我用GCC编译程序,它将在用Cygwin编译的终端上正常工作(mintty,尽管我用rxvt得到了相同的结果)

有谁能解释一下为什么会发生这种情况,以及我怎样才能阻止它发生?我希望编译我的程序独立于Cygwin,同时仍然使用基于Cygwin的终端

谢谢

int main()
{
        char something[12];

        printf("This printf() should be outputted before you are prompted for input: ");

        fgets(something, sizeof something, stdin);

        printf("You entered, %s", something);
}

这取决于标准输入和标准输出的缓冲。我不确定C标准对这个(C++中的流是默认绑定)的说明,但是你可以用标准的输出来刷新标准输出:

 fflush( stdout );

调用printf.

后,这取决于标准输入和标准输出的缓冲。我不确定C标准对这个(C++中的流是默认绑定)的说明,但是你可以用标准的输出来刷新标准输出:

 fflush( stdout );

调用printf.

后,标准输出流通常是行缓冲的,即打印换行时缓冲区被刷新

您可以使用以下命令显式刷新它:

fflush(stdout);
您可以通过以下方式关闭给定流
s
的缓冲:

setvbuf(s, NULL, _IONBF, 0);

有关更多详细信息,请参阅。

标准输出流通常是行缓冲的,即当您打印换行时,缓冲区会被刷新

您可以使用以下命令显式刷新它:

fflush(stdout);
您可以通过以下方式关闭给定流
s
的缓冲:

setvbuf(s, NULL, _IONBF, 0);

有关更多详细信息,请参阅。

Mintty和rxvt是基于Unix的终端仿真器。Cygwin基于

使用Cygwin gcc编译程序时,它会链接到Cygwin DLL,该DLL包含使连接到终端的流在Unix系统上正常工作的所有魔法,这意味着默认情况下是行缓冲


但是,使用tcc编译程序时,会创建一个本机Windows程序,该程序只会看到底层的Windows管道。在Microsoft C库中,连接到管道的流在默认情况下是完全缓冲的,这就是为什么使用
fflush(stdout)
显式刷新或使用
setvbuf(stdout,NULL,_IONBF,0)
禁用缓冲的原因。MS的C库不支持行缓冲。

Mintty和rxvt是基于Unix的终端模拟器。Cygwin基于

使用Cygwin gcc编译程序时,它会链接到Cygwin DLL,该DLL包含使连接到终端的流在Unix系统上正常工作的所有魔法,这意味着默认情况下是行缓冲


但是,使用tcc编译程序时,会创建一个本机Windows程序,该程序只会看到底层的Windows管道。在Microsoft C库中,连接到管道的流在默认情况下是完全缓冲的,这就是为什么使用
fflush(stdout)
显式刷新或使用
setvbuf(stdout,NULL,_IONBF,0)
禁用缓冲的原因。MS的C库不支持行缓冲。

默认情况下,stdout在发送到终端时是行缓冲的,而在发送到其他对象(管道、套接字、文件等)时是完全缓冲的。相比之下,stderr在默认情况下是无缓冲的(因为它用于写入可以诊断崩溃原因的信息,可能是在自动刷新缓冲区之前).@Donal Yep,这是标准所说的,也是Cygwin实现的,但不是Microsoft C库。在那里,stdout和stderr在连接到控制台时都是无缓冲的,在连接到文件或管道时都是完全缓冲的。行缓冲不受支持。@ak2:这就是为什么我没有将其作为解决方案提供的原因。MS fluffing还没有C库的er部分并不奇怪……默认情况下,stdout在发送到终端时是行缓冲的,而在发送到其他对象(管道、套接字、文件等)时是完全缓冲的。相比之下,stderr在默认情况下是无缓冲的(因为它用于写入可以诊断崩溃原因的信息,可能是在自动刷新缓冲区之前).@Donal Yep,这是标准所说的,也是Cygwin实现的,但不是Microsoft C库。在那里,stdout和stderr在连接到控制台时都是无缓冲的,在连接到文件或管道时都是完全缓冲的。行缓冲不受支持。@ak2:这就是为什么我没有将其作为解决方案提供的原因。MS fluffing还没有呃,C库的一部分并不奇怪……在所有答案中,我认为这一个有最彻底的解释,这就是为什么我选择它作为“最佳”答案。谢谢大家!在所有答案中,我认为这一个有最彻底的解释,这就是为什么我选择它作为“最佳”答案。谢谢大家!