【问题标题】:Character counting program doesnt work as it should字符计数程序无法正常工作
【发布时间】:2016-08-22 14:51:00
【问题描述】:

我使用 Dev-C++5.11 在我的 Windows XP PC 中创建了一个 C 程序。这是我看到的一个典型的字符计数程序,它是这样的:

#include <stdio.h>

main() {
    long nc;
    nc = 0;
    while (getchar() != EOF) {
        ++nc;
    }
    printf("%ld", nc);
}

它编译没有问题,但只有当我按下的字符中包含输入按钮 (\n) 时,它才能正常工作。如果我不打印,它要么打印 0,要么什么都不打印。我尝试包含其他字符,例如制表符或退格,但仍然没有。我正在使用 ctrl+c 来终止它。我做错了什么?

【问题讨论】:

  • 也许它不能“按应有的方式”工作,但它只能以它可以工作的方式工作,因为您正在使用等待“输入按钮”的 getchar() 函数
  • @DarkoDjuric: getchar() 不等待“输入”,它等待输入实际出现在stdin。两者是非常不同的东西。
  • @DevSolar 在使用 getchar() 函数时,有没有其他方法可以让它“实际出现在标准输入”?
  • @DarkoDjuric:您需要在输入端禁用缓冲 8*。这可以是您的终端软件的设置。或者您可以使用直接与终端缓冲区通信的 API,即所谓的“原始输入”。 Windows 有 &lt;conio.h&gt; 支持 unbuffered function getch()。 Unix 有(如果已安装)ncurses 库 &lt;curses.h&gt;function of the same name(但需要一些额外的管道才能“正常工作”)。无论如何,标准中没有这样的功能...

标签: c


【解决方案1】:

缓冲输入。

当您输入输入时,它会被终端缓冲(cmd.exe、xterm 等)。此时您的程序仍然没有“看到”任何输入。只有在您按下回车后,终端才会将缓冲区内容发送到您的程序。

如果您在按 Enter 之前终止程序,则不会发送/处理任何内容。

【讨论】:

    【解决方案2】:

    您的程序应该可以正常运行。尝试通过将文件重定向到其中来运行它:

    myprogram < somefile
    

    您观察到的问题来自终端对文件结尾的处理。在 Windows 中键入 Ctrl-Z&lt;enter&gt;,在 Unix 中键入 Ctrl-D 来表示文件结束。

    但是请注意,您应该这样编写程序:

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

    【讨论】:

      【解决方案3】:

      getchar() 读取到 EOF;因此,在 while 循环退出(即 getchar() 函数返回 EOF 时)之前,您不会看到 printf() 输出。

      为了发送 EOF,您可以按 CTRL+D。尝试输入您的输入,然后按 CTRL+D 看看是否有效。至少在 UNIX/OS X 中,这将发送 EOF。您还可以比较字符,如果按下某个键,则退出循环并查看您的计数。

      如果您正在从另一个程序输入输出,那么这应该可以正常工作,因为它会在输出完成管道输入后接收 EOF。例如,cat 文件 | ./counterprogram

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 2012-08-24
        • 1970-01-01
        • 2017-01-22
        • 1970-01-01
        • 2018-07-03
        • 2013-01-30
        相关资源
        最近更新 更多