【问题标题】:c: reading input with while(scanf()==1) isn't leaving the loopc: 使用 while(scanf()==1) 读取输入不会离开循环
【发布时间】:2018-01-14 02:49:35
【问题描述】:

我正在从 stdin 读取到数组 input[],但它在读取输入后永远不会离开循环并一直期待更多输入。我究竟做错了什么?

        char input[1000];
        while(scanf("%s",input)==1){
            printf("%s\n",input);
        }

【问题讨论】:

  • scanf 返回成功匹配和分配的输入项数。 %s 匹配一系列非空白字符,也就是您的第一个单词,但将换行符 \n 留在缓冲区中。 scanf 返回 1。然后它读取换行符并返回一个,然后输入第二个单词,等等等等。你看到循环了吗?
  • 这里应该有一个操作系统标签。
  • 你希望用户输入什么来表示输入结束?

标签: c scanf


【解决方案1】:

您期望什么,您如何尝试终止它? scanf("%s", input) 始终保持等待输入,如果 stdin 是生命值,则始终返回 1,它会跳过空格并匹配第一个不带空格的字符序列。请仔细阅读说明书。

如果你想继续使用scanf,那么你应该提供一个特殊的字符串来打破循环。

【讨论】:

    【解决方案2】:

    既然scanf()返回**成功读取的元素个数,就必须想办法让它无法读取%s。一种常见的做法是使用 EOF 结束输入,在 Windows 控制台中是 Ctrl-Z,然后是 Enter,在 Unix 终端上是 Ctrl-D。读取EOF后scanf()会返回EOF当然不是1,然后循环正常退出。

    或者,您可以在代码中使用自定义终止字符串:

        char input[1000];
        while (scanf("%s", input) == 1) {
            if (strcmp(input, "end") == 0) {
                // End the loop
                break;
            }
            printf("%s\n", input);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-18
      • 2019-12-05
      • 2022-01-22
      • 2014-05-20
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多