【问题标题】:While loop asking for input until ctrl-d using CWhile 循环要求输入直到 ctrl-d 使用 C
【发布时间】:2014-09-10 16:15:19
【问题描述】:

我想创建一个 while 循环,不断询问用户输入,直到用户 ctrl-d 退出。我怎样才能正确地做到这一点?我现在正在使用这个:

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

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

【问题讨论】:

  • if(NULL==fgets(user_input, 1000, stdin))break;
  • do printf(...) while (fgets(...) != NULL);
  • @WhozCraig do..while 的唯一问题是它没有机会在再次提示之前处理 fgets 返回的数据。
  • @par 从未说过会,但它是作为 OP 发布版本的自断循环的替代方案,这同样奇怪。我同样思考了为什么发布的循环是原样的。 while (printf(...), fgets(...)) {...} 怎么样
  • "我想不断地询问用户......" 所以即使用户已经输入了一些内容并且没有'还没有按下 ?

标签: c


【解决方案1】:

您必须测试 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
}

【讨论】:

  • 我建议在fgets 之前使用fflush(NULL); ...(即使fgets 的某些实现可能会这样做)
  • 好点。对于 OP,这样做的原因是确保在程序等待输入之前,提示文本会显示在屏幕上。如果没有尾随换行符,输出缓冲区中可能没有足够的数据来打印您的提示。我将编辑我的答案。
  • 不应该是fflush(stdout)吗?
  • 我明白了。 fflush(NULL) 刷新所有可刷新的流。 fflush(stdout) 是特定于流的。
【解决方案2】:

ctrl-d 将发送EOF(文件结尾)字符,在fgets 中转换为NULL 指针:

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

【讨论】:

  • 没有“(文件结尾)字符”。
  • 一开始就没有“字符”,如果你想挑剔的话。
猜你喜欢
  • 2022-01-18
  • 2023-03-16
  • 2015-07-30
  • 2018-04-22
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多