【问题标题】:Simple char-counting program behaves strangely简单的字符计数程序行为异常
【发布时间】:2016-02-09 07:24:07
【问题描述】:

此代码预计会计算用户输入的字符,除了'\n',预计'\n' 在其他'\n' 之后。稍后我会解释。

#include <stdio.h>

int main () {
        int numberOfChars = 0;

        do {
                while(getchar() != '\n')
                        numberOfChars++;
        } while(getchar() != EOF && numberOfChars++);

        printf("Number of chars = %d\n", numberOfChars);

        return 0;
}

这里有一些例子:


输入: ABCCtrl + D

预期输出:3

实际输出:程序没有终止,屏幕上显示123^D


输入: ABC回车, Ctrl + D

预期输出:3

实际输出:3


输入: ABC输入ABC , Enter, Ctrl + D

预期输出:6

实际输出:6


输入: ABC回车回车Ctrl + D

预期输出:4

实际输出:程序没有终止,屏幕上显示:

abc

^D

我使用的是 OS X-10.10.5、bash-3.2 和 clang-700.1.81。

提前致谢。

【问题讨论】:

    标签: c bash input getchar


    【解决方案1】:

    当内部循环得到EOF返回时,不等于'\n',所以循环再次尝试,得到另一个EOF,它仍然不是'\n',所以它有另一个去.电脑很有耐心……

    在内循环中,使用:

    int c;
    while ((c = getchar()) != EOF && c != '\n')
        numberOfChars++;
    

    这将在 EOF 或到达行尾时停止。

    另请参阅附在您的answer 上的我的讨论——尽管我错过了内部循环的 EOF 问题。

    【讨论】:

    • 循环不仅会终止 EOF,也会终止 '\n'。有一个条件“期望 '\n' 跟随其他 '\n'”——这意味着 '\n' 不应停止循环。
    • @SiddharthaGhosh:外循环处理这个问题——我只是没有在我的回答中重复外循环,因为我没有建议对其进行任何更改。
    • 是否需要 2 个循环(外部和内部)?计数可以通过一个循环来完成。
    • IMO,不,不需要两个循环。但是,OP 提出了双循环作为对原始代码给出的答案似乎是预期的两倍的问题的答案,因为该问题的 OP 忘记了(或没有意识到)换行符是字符。请参阅链接。在这种情况下,问题是“为什么这个双循环不能正确终止”而不是“这是一种计算字符的好方法”。
    【解决方案2】:

    您有 2 个getchar() 调用 - 任何一个都可以读取 EOF 或“\n”。你需要重构,所以只有一个getchar()

    例如在您的第一个示例中,没有“\n”,因此您永远不会退出内部 while 循环。在您的第四个示例中,第二个“\n”被第二个getchar 读取,因此您再次陷入内部。

    【讨论】:

      【解决方案3】:

      对上面 Jonathan 的回答稍作修改(以确保循环仅以 EOF 停止,而不是 '\n'):

      编辑:另外,这是单循环解决方案(不需要外循环和内循环)。

      int c;
      while ((c = getchar()) != EOF)
      {
          if(c != '\n')  numberOfChars++;
      }
      

      【讨论】:

      • 很简单,但在我的第四个示例中这将输出 3,我希望是 4。
      • 在你的第四个例子中,输出应该只有 3。根据这个问题中的问题描述,“count characters ... except '\n', expect '\n's following other '\n'” - 所以,这应该排除两个'enter's。
      • 这是我的错:实际上我的意思是“除了('\n',期望 '\n's following other '\n')”。英语不是我的母语。很抱歉。
      【解决方案4】:

      首先,我必须为我的问题中令人困惑的描述道歉:

      ……除了 '\n',期望 '\n' 跟随其他 '\n'。

      我的意思是:

      ……除了 ('\n',期望 '\n' 跟随其他 '\n')。

      所以我的第四个例子没有错别字。

      最后,我想出了一个解决方案:

      #include <stdio.h>
      
      int main () {
              int numberOfChars = 0;
      
              int c;
              do {
                      while((c = getchar()) != '\n' && c != EOF )
                              numberOfChars++;
                      while((c = getchar()) == '\n')
                              numberOfChars++;
              } while(c != EOF && numberOfChars++);
      
              printf("Number of chars = %d\n", numberOfChars);
      
              return 0;
      }
      

      我相信这段代码可以很好地展示我想要的东西。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 2019-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多