0

K&R C Programming 第 2 版中的一项作业说我必须编写一个程序来打印其输入中单词长度的直方图。我相信我知道该怎么做,但是在我刚刚了解的数组上运行测试程序时,无论我输入什么,我得到的都是“8”。这是到目前为止的程序:

#include <stdio.h>

/* write a program to print a histogram
of the lengths of words in its input */
main()
{
      int wl[11];
      int cc, c;

      while ((c=getchar()) != EOF);
      {
            if (c != ' ')
               ++cc;
            if (c == ' ' && cc == '1')
            {
               ++wl[0];
               c = 0;
            }
       putchar(wl[0]);
      }
}

这可能只是因为我是编程的初学者,但老实说,我看不出我在哪里出错了。任何帮助,将不胜感激。

4

3 回答 3

2

首先初始化变量:

int wl[11] = {0};
int cc = 0;

默认情况下,内存包含 C 中的垃圾。

编辑:超越显而易见

  • 比较cc == '1'并没有达到您的预期。应该是cc == 1
  • 我猜++wl[0]应该是这样++wl[cc]。这假定最大字长为 11。
  • c = 0应该重置cc-c是当前字符,cc是当前字长
  • putchar需要一个字符而不是一个int,所以你也需要解决这个问题

不过好的开始。

于 2012-07-08T00:58:41.947 回答
1

你在这里有很多问题。

main()

尽管当时省略返回类型是相当普遍的,但现在已经不复存在了。你可能想把它写成:

int main() 

反而。

{
      int wl[11];

正如@D.Shawley 已经指出的那样,这将包含垃圾。

      int cc, c;

他忘记指出的是,这些也会。这对 来说无关紧要c,但对cc.

      while ((c=getchar()) != EOF);
      {
            if (c != ' ')
               ++cc;

在这里,您正在递增cc,但您从未先将其设置为已知值,因此您不知道它是从什么开始的,或者(因此)您的递增将产生什么结果。

            if (c == ' ' && cc == '1')

我猜你并不是真的想要'1'这里——你可能只是想要1。也就是说,您不想cc与 digit进行比较'1',而是与值 1 进行比较。

            {
               ++wl[0];
               c = 0;

虽然它是无害的,但归零c在这里并没有太大的作用——也许你想归零cc?我不确定你真正想要做什么。猜测一下,您可能也不想增加wl[0]

            }
       putchar(wl[0]);

你可能也不想putchar在这里——你可能想写成wl[0]一个 int 或者(产生一个直方图)用它作为像 '*' 这样的东西的计数来打印出来。

于 2012-07-08T01:06:46.757 回答
0

我会在这里使用 argc 和 argv (在你的 C 书中查找)。这样做的好处是它为您提供了单词的数量,并且您不必自己处理输入(让操作系统和您的标准库处理它)。您可以 malloc 大小数组(直方图存储桶),但您也可以做出“合理”的假设,以获得大多数英语单词(希望您不是德语 :-))。

#include <string.h>
#include <stdio.h>

// assume longest word is "Supercalifragilisticexpialidocious"    
#define MAX_WORD_LENGTH    (35)

int main(int argc, char* argv[])
{
  size_t sizes[MAX_WORD_LENGTH] = {0};

  for (int i=0; i<argc; ++i)
  {
    size_t len = strlen(argv[i]);

    if (len < MAX_WORD_LENGTH)
    {
      ++sizes[len]; // increment bucket
    }
    else
    {
      ++sizes[0]; // too long, put in default bucket
    }
  }

  // print the buckets
  for (int i=1; i<MAX_WORD_LENGTH; ++i)
  {
    printf("%d ", sizes[i]); 
  }

  // print the default bucket
  printf("%d", sizes[0]);
}
于 2012-07-08T01:48:53.203 回答