Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
select()函数不允许printf()结尾没有“\n”_C_Sockets_Select_Io_Printf - Fatal编程技术网

select()函数不允许printf()结尾没有“\n”

select()函数不允许printf()结尾没有“\n”,c,sockets,select,io,printf,C,Sockets,Select,Io,Printf,我在使用select时遇到问题:它在我的程序中表现得很奇怪,我不明白为什么 #include <stdio.h> #include <netdb.h> int main() { char msg[1024]; fd_set readfds; int stdi=fileno(stdin); FD_SET(stdi, &readfds); for (;;) { printf("Input: "); select(stdi+1, &rea

我在使用select时遇到问题:它在我的程序中表现得很奇怪,我不明白为什么

#include <stdio.h>
#include <netdb.h>

int main()
{
char msg[1024];

fd_set readfds;
int stdi=fileno(stdin);

FD_SET(stdi, &readfds);

for (;;) {
    printf("Input: ");
    select(stdi+1, &readfds, NULL, NULL, NULL);

    if (FD_ISSET(stdi, &readfds))
        {
        scanf("%s",msg);
        printf("OK\n");
        }
    }
}
但真正的程序行为如下所示:

123
Input: OK
让我们将调用printfInput:中的参数更改为输入:\n。我们将得到的是

Input: 
123
OK
因此,select函数将冻结输出,直到下一次printf以\n结尾

如何获得预期的行为?

默认情况下,stdout是行缓冲的,这意味着在遇到“\n”之前不会写入输出。因此,需要在printf之后使用fflush强制将缓冲数据写入屏幕

另外,您可以使用常量STDIN\u FILENO(始终为0),而不是执行filenostdin。默认情况下,stdout是行缓冲的,这意味着在遇到“\n”之前不会写入输出。因此,需要在printf之后使用fflush强制将缓冲数据写入屏幕


此外,您可以使用常量STDIN\u FILENO(始终为0),而不是执行filenostdin。

fflush将所有缓冲数据刷新到相关流中。它是为了提高系统的性能,因此I/O以批量方式进行。

fflush将所有缓冲数据刷新到相关流中。这是为了提高系统的性能,所以I/O是批量进行的。

伙计,你太棒了。非常感谢您如此快速和有用的帮助!俄罗斯致以最良好的问候和祝愿!伙计,你太棒了。非常感谢您如此快速和有用的帮助!俄罗斯致以最良好的问候和祝愿!
Input: 
123
OK