【问题标题】:while ((c = getchar()) != EOF) Not terminatingwhile ((c = getchar()) != EOF) 未终止
【发布时间】:2013-09-05 02:48:09
【问题描述】:

我一直在阅读“C 编程语言”,并且了解了输入和输出的这一部分。

我读过其他线程说控制台无法将输入识别为EOF。所以我应该在 Windows 中使用 CTRL + Z 或在 Unix 中使用 CTRL + D (这些都不起作用对我来说)。

我还读到其他人问同样的问题,他们说他们可以让它工作,他们代码中的问题是语法而不是程序没有终止。

还有其他解决方案吗?

这是代码:

#include <stdio.h>
main()
{
    int nb, nl, nt, c;
    nb = 0;
    nl = 0;
    nt = 0;
    while ((c = getchar()) != '\n'){
        if (c == ' ')
            ++nb;
        else if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++nt;
    }
    printf("Input has %d blanks, %d tabs, and %d newlines\n", nb, nt, nl);
}

编辑:\n 应该是 EOF,我在发布之前一直在搞乱,我忘了我改变了它:P

它也不适用于 EOF,我只是跳过了那个。

【问题讨论】:

  • 在条件 (c = getchar()) != '\n') , \n 应该是 EOF
  • 我在你的代码中没有看到!= EOF
  • 您上面的代码将接受 '\n' 作为终止条件
  • 编辑您的问题,以便我们可以看到您正在运行的实际代码,这可能是指EOF。复制并粘贴源代码;不要重新输入。 while ((c = getchar()) != EOF) 应该工作。您使用的是 Windows 还是 Unix/Linux?准确描述(在您的问题中,而不是在对此评论的回复中)您在运行程序时提供的输入。
  • 我用putty连接到Ubuntu,对我来说CTRL+DD会发送一个EOF条件。

标签: c eof


【解决方案1】:
while ((c = getchar())  !=EOF) {


}

然后在 Windows 上使用 Ctrl+ZF6

以下将等待\nEOF,先出现

while((c = getchar()) != '\n' && c != EOF){

}

【讨论】:

  • \n 不应成为停止条件,因为 OP 旨在计算遇到的 \n 字符数。
【解决方案2】:

在 Windows 上,您在一行上单独键入 Ctrl-Z(没有空格或任何内容),然后键入 Return。在 Windows 上,从技术上讲,您可以跳过 EOF 指示符并继续读取字符,但这不适用于其他操作系统,因为 EOF 实际上意味着 EOF。

【讨论】:

    【解决方案3】:
    while ((c = getchar()) != '\n'){
        if (c == ' ')
            ++nb;
        else if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++nt;
    } 
    

    根据您的 while 循环中的条件,您将无法计算换行数,因为当用户输入换行符 ('\n') 时,您将停止 while 循环

    除此之外,计算空格和制表符也可以正常工作。

    CTRL+Z 将在 Windows 中被识别为 EOF。但是为了在你的程序中识别它,在while循环中使用条件((c = getchar()) != EOF)。 现在当用户按下组合键:CTRL+Z,它将作为EOF输入到控制台,程序应该将其识别为字符输入。

    这样做可以让您计算输入中的行数

    所以,我的建议是:

    while ((c = getchar()) != EOF){
        if (c == ' ')
            ++nb;
        else if (c == '\n')
            ++nl;
        else if (c == '\t')
            ++nt;
    } 
    

    【讨论】:

      【解决方案4】:

      如果您使用的是 unix 系统:

      在手动输入程序时通过键盘模拟EOF的唯一方法是按CTRL+D

      这里有几种方法可以为您的程序提供输入,并能够在输入结束时发出 EOF 信号:

      • 利用here string 格式将文件的字符串表示形式提供给程序。
      ./myprog <<< "Here is a string to work with"
      
      • 或者,您还可以使用输入重定向将包含输入的文件提供给程序。
      ./myprog < input.file
      

      上面列出的任何方法都适用于以下代码:

      #include <stdio.h>
      #ifndef EOF
      #define EOF (-1)
      #endif
      int main(void)
      {
          int nb, nl, nt, c;
          nb = 0;
          nl = 0;
          nt = 0;
          while ((c = getchar()) != EOF){
              if (c == ' ')
                  ++nb;
              else if (c == '\n')
                  ++nl;
              else if (c == '\t')
                  ++nt;
          }
          printf("Input has %d blanks, %d tabs, and %d newlines\n", nb, nt, nl);
          return 0;
      }
      
      • 不要让窗口离开游戏。要在 Windows 上模拟键盘上的 EOF,请使用 CTRL+Z 组合键

      不确定unix的here-string格式是否适用于windows,但输入重定向应该类似

      【讨论】:

      • 不,文件末尾并不总是有“EOF 字符”。 Windows 文本文件有时会这样做,但 Unix 文本文件不会。文件结束是一个条件,而不是字符,EOFgetchar() 返回的一个特殊值,表示文件结束或错误条件。 Control-D 或 Control-Z 不会“模拟 EOF”;它们触发文件结束条件,导致getchar() 返回EOF 作为其结果。 (这就是为什么getchar() 返回int 而不是char。)
      • @Keith Thompson 很高兴知道
      【解决方案5】:
          /* This program will calculate the number of blanks, tabs and new line in a text stream */
      
      #include <stdio.h>
      
      main () 
      {
          int c,nl = 0, blank = 0, tab = 0; //Newline, blanks and tabs.
          while ((c = getchar()) != EOF) {
              if (c == '\n')
                  ++nl;
              else if (c == '\t')
                  ++tab;
              else if (c == ' ')
                  ++blank;
      }
          printf("Tabs = %d\nBlanks = %d\nNewLine = %d",tab, blank, nl);
      }
      

      我编写了以下代码,它可以在 Ubuntu 上正常运行。因为和你写的很相似,所以我试了一下代码,Ctrl-D在UNIX下正常工作。

      我测试了下面的代码,发现如果我们在文本流中输入 \n 它不会增加新行的计数器,对于 \t 选项卡也是如此。只有按 enter 换行和按 tab 换行才会被计数器计数,这是需要注意的一点。

      发生这种情况是因为按 Enter 实际上会放置一个换行符,它是单个字符,而输入 \n 则被视为不同,它们实际上是两个字符。

      我认为这会增加这个问题的价值,所以我也解释了这个问题。 谢谢。

      【讨论】:

        【解决方案6】:

        换行

        // Buggy, you want calculate the # of '\n' in loop body,
        // so logically you shouldn't use it as a stop condition.
        while ((c = getchar()) != '\n')
        

        while ((c = getchar()) != EOF)
        

        然后尝试在 Windows 的控制台窗口中按 Ctrl + C。它适用于我运行 Win7 的平台。

        【讨论】:

        • 使用 Ctrl-C 是解决这个问题的简单方法,而不是问题的答案。
        【解决方案7】:

        首先按 Ctrl + Z 这将打印 ^Z 然后按 Enter 转到 EOF ..

        【讨论】:

          【解决方案8】:

          要在 Turbo C++ 中识别 EOF,请在终端窗口中按 Ctrl+z;这将在程序中充当 EOF,然后终止程序....条件:

          while ((c = getchar()) != EOF) 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多