4

我是一个总 C n00b 试图自学 C 关闭 K&R。我的问题有点令人尴尬。好的,这里是:我无法让程序使用 getchar 来提供我期望的那种输出。如果你碰巧手头有 K&R,我会坚持练习 1.13。问题是,“编写一个程序来打印其输入中单词长度的直方图。”由于我遇到的这个问题,我什至无法处理水平版本。

我在 XP 上使用 Dev-C++(mingW 编译器)并在命令行下运行程序。我的问题是,当我尝试运行我的程序时,它会等待我输入要扫描的字符,但是当我完成输入并按 Enter 时,它什么也没。我希望它能够按照我的预期继续打印直方图。实际上,它甚至似乎都没有计算字长,因为正如您在代码中看到的那样,当我尝试打印 ctr 数组中的内容以查看它是否包含任何内容时,什么都不会打印。

我太n00b了,我不知道是我的代码还是命令行有问题。但我怀疑这是系统的问题,因为当我尝试编译和运行模型程序时,也会发生同样的事情。输入输入,按 Enter,没有任何反应。如果我 Ctrl-C,有时它会吐出一两个星号,看起来与模型输出完全不同。其他时候,它什么也不做(只是回到提示符)。

这是我的练习代码。我花了一整天的时间在这上面,并质疑我继续编程的能力。如果有人能把我从这个洞里救出来,我真的非常感激!

另外,我对上面提到的模型程序还有另一个问题,但我认为我应该将其发布在它自己的问题中。谢谢大家:)

#include <stdio.h>

//#define 1 IN
//#define 0 OUT
int main () {
    //start w/ state = OUT
    int c = 0;
//    int state = OUT;
    int len = 0;
    int ctr[12];
    int i, j;
    i = j = 0;

    for (i = 0; i <12; i++)
        ctr[i] = 0;
    while ((c = getchar()) != EOF)
       if (c != ' ' && c != '\t' && c != '\n') {
//            state = IN;
            len++;
            printf("%d", len);
            }
       else {
            ctr[len]++;
            len = 0;
            }            
    for (i = 0; i <12; i++) 
        printf("%d\n", ctr[i]);
    for (i = 0; i <12; i++) {
        printf("%d\n", i);   
        for (j = 0; j <= ctr[i]; j++)
            printf("-");
        printf("\n");
        }
    return 0;
}
4

3 回答 3

7

您的 while 循环正在寻找 EOF,它代表文件结尾,而不是行尾。

在 Windows 上,您需要键入 ctrl-z 来模拟文件结束。

于 2010-01-04T22:00:05.043 回答
1

看起来您实际上并没有将 c (您的输入)存储在任何地方......也没有打印它。您正在打印字符串的大小,而不是实际字符。如果你 ctr[i] = c; 某处(即您将字符添加到数组中),然后打印数组,您将看到您的输入。哦,是的,关于 ctrl-z 的答案也很重要。此外,如果您对这门语言完全陌生,我强烈建议您在 while 内容周围加上括号。还需要一段时间,您才能只看一眼代码,就知道什么会落入 while 循环的范围内,如果没有大括号,什么不会。

于 2010-01-04T21:59:53.233 回答
1

我没有看到代码有什么问题,所以我在 gcc 下加载了它,它似乎工作正常,只要你记得你必须放入一个 EOF (CTRL-D) 来终止 while 循环。我输入了 4 行,虽然我无法就答案的正确性做出任何陈述,但每次我按 Enter 键时,我都会得到一系列数字,等于我输入的字符数,后跟一个空格。这正是您的代码所说的。

当我输入 CTRL-D 时,我得到了摘要信息。同样,我不会对输出的正确性发表任何声明,但我确实得到了您的代码中描述的两个主要部分。

于 2010-01-04T22:08:14.660 回答