使用C在ctrl-d之前循环请求输入

使用C在ctrl-d之前循环请求输入,c,C,我想做一个while循环,它不断地请求用户输入,直到用户ctrl-d退出。如何才能正确地执行此操作?我现在正在使用这个: while (1) { printf("Enter host name: "); fgets(user_input, 1000, stdin); } 这是可行的,除了用户必须点击ctrl-c来结束程序。我想不断地询问用户的输入,直到他/她点击ctrl-d。我该怎么做呢?您必须测试EOF,这是CTRL-D返回的结果 这样做:

我想做一个while循环,它不断地请求用户输入,直到用户ctrl-d退出。如何才能正确地执行此操作?我现在正在使用这个:

 while (1)
    {
        printf("Enter host name: ");
        fgets(user_input, 1000, stdin);
    }

这是可行的,除了用户必须点击ctrl-c来结束程序。我想不断地询问用户的输入,直到他/她点击ctrl-d。我该怎么做呢?

您必须测试EOF,这是CTRL-D返回的结果

这样做:

while ( fgets( ... ) != NULL ) {
    ...
}
编辑:

既然你在提示,那么最好是:

for ( ;; ) {
    printf( "enter input: " );
    fflush( NULL );   // make sure prompt is actually displayed, credit Basile Starynkevitch
    if ( fgets( input, ... ) == NULL ) break;

    // handle input here
}
ctrl-d将发送一个
EOF
(文件结尾)字符,该字符在
fgets
中翻译为
NULL
指针:

while (fgets(user_input, 1000, stdin) != NULL) {
    // do stuff...
}
// no more user input

if(NULL==fgets(用户输入,1000,标准输入))中断
当(fgets(…)!=NULL时执行printf(…)
@WhozCraig do..while唯一的问题是,在再次提示之前,它不会给您机会处理fgets返回的数据。@par从未说过会这样做,但它是OP发布版本的一个自断循环的替代方案,这同样奇怪。我同样在思考为什么发布的循环保持原样。怎么样
while(printf(…),fgets(…){…}
“我想不断地询问用户…”因此,即使用户已经键入了一些内容,但尚未按下,按下Ctrl-D也会中断用户的阅读?我建议
fflush(NULL)
fgets
之前。。。(即使一些
fgets
的实现可以做到这一点)这一点非常重要。对于OP,执行此操作的原因是确保在程序等待输入之前,提示符的文本进入屏幕。如果没有尾随换行符,输出缓冲区中可能没有足够的数据来打印提示。我会编辑我的答案。应该是
fflush(stdout)
?我明白了
fflush(NULL)
刷新所有可刷新的流
fflush(stdout)
是特定于流的。没有“(文件结尾)字符”。如果您想挑剔,首先没有“字符”。