【问题标题】:counting characters in the input with while loop使用while循环计算输入中的字符
【发布时间】:2015-06-05 07:18:18
【问题描述】:

我写了一个简单的c程序来计算字符数

#include <stdio.h>
main()
{
    long nc;
    nc = 0;

    while (getchar() != EOF)
      ++nc;

    printf("%ld\n", nc);
}

这个程序没有打印我的字符。在测试不同的案例时,我发现我陷入了无限的while() 循环。

【问题讨论】:

  • 尝试使用:while (getchar() != '\n')。请记住,getchar() 在您发送回车 (\n) 之前不会终止。

标签: c while-loop eof


【解决方案1】:

这个程序没有打印我的字符

不会的。您没有向打印它们添加任何语句。

我发现我陷入了无限循环

如果您没有命中 破坏 条件,您将进入循环。您需要获取EOF 才能退出循环。使用

  • CTRL+Z(在 Windows 上)
  • CTRL+D(在 linux 上)

现在,解决方案:

  1. getchar() 不会打印这些值。您必须使用 putchar() 来存储值并显式打印(如果您愿意)。

  2. 您要么提供EOF,要么更改while() 的断开条件以退出基本 无限循环。


除了编码问题,您还需要考虑逻辑。在当前的代码形式中,getchar() 也将 换行符 (\n) 计为 有效 字符。解释一下,输入形式为

$ ./a.out  输入
一个      ENTER
s      ENTER
d      ENTER
f       ENTER
g      ENTER
CTRL+D

会产生结果

10

但这不是我们通常所说的计算字符。您可能还想查看这部分逻辑。

也就是说,main() 的推荐签名是int main(void)

【讨论】:

    【解决方案2】:

    试试下面的

    #include <stdio.h>
    
    int main( void )
    {
        int c;
        long nc = 0;
    
        while ( ( c = getchar() ) != EOF && c != '\n' ) ++nc;
    
        printf( "%ld\n", nc );
    }
    

    您必须生成 EOF 状态(在 UNIX 系统中为 Ctrl+d 或在 Windows 中为 CTRL+z)或直接按 Enter。

    【讨论】:

    • @Sourav Ghosh 谢谢。由于复制和粘贴,我犯了这个错误。:)
    • 没有问题,先生,我们所有人都会遇到。刚注意到这件事,所以想写个笔记。干杯:-)
    • @VladfromMoscow 仍然没有打印出字符数。
    • @katyal93 我运行程序并输出正确的结果。也许您的控制台窗口很快就关闭了。在这种情况下,您可以在 printf 语句之后一个接一个地放置两个 getchar,这样会有延迟。
    【解决方案3】:

    试试这样:

    #include <stdio.h>
    
    int main(void)
    {
        int c;
        long nc = 0;
    
        while ( ( c = getchar() ) != EOF && c != '\n' ) 
        ++nc;
    
        printf( "%ld\n", nc );
    }
    

    【讨论】:

    • 这一行: 'while ( ( c = getchar() ) != EOF || c != '\n' ) ' 永远停留在循环中,因为 'c' 不能同时存在EOF 和 '\n' 建议:'while ( ( c = getchar() ) != EOF && c != '\n' ) '
    【解决方案4】:
    while (getchar() != '\n')
       ++nc;
    printf("%ld \n",nc);
    

    成功了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-27
      • 2011-12-29
      • 1970-01-01
      • 2021-09-14
      • 2020-06-08
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      相关资源
      最近更新 更多