数组调试C?

数组调试C?,c,arrays,C,Arrays,《K&R C编程第二版》中的一项作业说,我必须编写一个程序来打印输入中单词长度的直方图。我相信我知道如何做到这一点,但当我在阵列上运行一个测试程序时,不管我输入什么,我得到的都是“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,

《K&R C编程第二版》中的一项作业说,我必须编写一个程序来打印输入中单词长度的直方图。我相信我知道如何做到这一点,但当我在阵列上运行一个测试程序时,不管我输入什么,我得到的都是“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]);
      }
}
#包括
/*编写一个程序来打印直方图
输入中单词的长度*/
main()
{
int-wl[11];
int cc,c;
而((c=getchar())!=EOF);
{
如果(c!='')
++抄送;
如果(c=''&&cc=='1')
{
++wl[0];
c=0;
}
putchar(wl[0]);
}
}

这可能只是因为我是一个完全的编程新手,但老实说,我看不出哪里出了问题。任何帮助都将不胜感激。

从初始化变量开始:

int wl[11] = {0};
int cc = 0;
默认情况下,内存包含C中的垃圾

编辑:超越显而易见的

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

开始得不错。

先初始化变量:

int wl[11] = {0};
int cc = 0;
默认情况下,内存包含C中的垃圾

编辑:超越显而易见的

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

不过这是一个很好的开始。

这里有很多问题

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
与数字
'1'
进行比较,而是与值1进行比较

            {
               ++wl[0];
               c = 0;
虽然它是无害的,但是归零
c
在这里并没有什么效果——也许你想归零
cc
?我不知道你到底想做什么。猜测一下,您可能也不想递增
wl[0]

            }
       putchar(wl[0]);

您可能也不希望在此处使用
putchar
——您可能希望将
wl[0]
作为一个int或(生成一个直方图)使用它作为要打印的“*”之类的计数。

您在这里遇到了一些问题

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
与数字
'1'
进行比较,而是与值1进行比较

            {
               ++wl[0];
               c = 0;
虽然它是无害的,但是归零
c
在这里并没有什么效果——也许你想归零
cc
?我不知道你到底想做什么。猜测一下,您可能也不想递增
wl[0]

            }
       putchar(wl[0]);

您可能也不想在这里使用
putchar
——您可能想将
wl[0]
写成一个int或(生成一个直方图)用它作为像“*”这样的计数来打印出来。

我会在这里使用argc和argv(在您的C书中查找)。这样做的好处是,它可以为您提供字数,您不必自己处理输入(让操作系统和标准库来处理)。您可以malloc size数组(柱状图bucket),但是您也可以做出一个“合理”的假设,以获得大部分英语单词(希望您不是德语:-)

#包括
#包括
//假设最长的单词是“supercalifragilisticexpialidious”
#定义最大单词长度(35)
int main(int argc,char*argv[])
{
大小大小[最大字长]={0};

对于(inti=0;i我会在这里使用argc和argv(在你的C书中查找)。它的好处是它提供了字数,你不必自己处理输入(让操作系统和标准库来处理)。你可以malloc大小数组(直方图桶),但你也可以做一个“合理”的假设这将获得大部分英语单词(希望你不是德语:-)

#包括
#包括
//假设最长的单词是“supercalifragilisticexpialidious”
#定义最大单词长度(35)
int main(int argc,char*argv[])
{
大小大小[最大字长]={0};
对于(int i=0;i@Ke