0

我最近购买了 The C 编程语言,并且一直在慢慢地阅读文本,以确保我理解了所有内容。我遇到了这个数组示例(第 1.6 章),由于 Stack Overflow 上已经回答了许多问题,我完全理解了这个示例。

问题是当我运行程序时,什么都没有打印出来。这本书有一个习惯,有时让人觉得不聪明,所以如果这是一个菜鸟问题,我提前道歉。我向你保证,我已经寻找了很长一段时间的答案。

这是文本中的代码。我正在使用 XCode 4:

#include <stdio.h>
/* count digits, white space, others */
main()
{
    int c, i, nwhite, nother;
    int ndigit[10];
    nwhite = nother = 0;

    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;

    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("digits =");

    for (i = 0; i < 10; ++i)
        printf(" %d", ndigit[i]);

    printf(", white space = %d, other = %d\n", nwhite, nother);
}

为什么不运行??

4

2 回答 2

3

这一行:

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

确保您的while循环继续,直到getchar()读取导致条件为假所需的字符。因此,在您向终端输入EOF字符之前,它将继续进行 - 为此,您需要使用组合键Ctrl+ D

于 2012-07-05T22:46:18.743 回答
3

我没有发现您的版本与本书的版本之间存在任何差异——我认为问题可能在于您运行程序的方式。

getchar()从标准输入中读取一个字符。这可以是终端设备、通往另一个程序的管道,甚至是网络套接字(很少见)。

当你运行这个程序时,它可能会一直呆在那里,直到你键入一些字符然后终止输入——如果你在新行上键入一个 Control+D 字符,大多数终端都会这样做。

更简单的方法是通过一种易于重现的机制为程序提供一些输入——文件中的管道或内容通过echo

./a.out < /etc/passwd
echo "hello world" | ./a.out

您可以使用任何程序代替echo- 您也可以使用ls(1)

ls | ./a.out

遗憾的是,K&R 这本书在很多方面都很出色,但它大多忽略了开发和执行环境——C 旨在用于如此庞大的机器阵列,以至于规范不包括分层目录结构,举一个简单的例子。

于 2012-07-05T22:47:19.590 回答