1

我目前正在通过 K&R 工作,但在搜索网络、再次尝试并搜索更多内容后,我陷入了困境,我来到 stackoverflow 寻求帮助!

任务是创建一个直方图,聚合每个单词中的字母数量,然后将信息显示为直方图。

我已经弄清楚了直方图部分,但我无法计算单词。

当我输入几个单词然后按 Ctrl+D 发送 EOF,并打印每个字符输入的出现次数;我在 index[0] 上返回了一个很大的值,通常在 '15773951' 周围

只是为了澄清我的代码将继续添加到 wc,用于计数字符的值,直到找到空格、换行符或制表符。然后它将使用一个数组来存储每个单词大小发生的次数,通过增加索引位置等于字长。

int main(void){
      int c, i, status, wc;
      int numbers[array_size];
      wc = 0; //used to count number of chars

     //innitialize array
     for(i=1; i<array_size; i++)
             numbers[i] = 0;

     /*start counting letters*/
     while((c = getchar()) != EOF){
             /*check if c is a space*/
             if((c=' ')||(c='\t')||(c='\n')){
                     numbers[wc-'1']++;
                     wc = 0;
              }else{
                      ++wc;
             }
     }


      printf("word size occured: ");
      for(i=0;i<array_size;i++)
              printf("%d\n", numbers[i]);

}

有代码,任何人都可以向我解释为什么这种情况不断发生这里也是一个输出示例:

word size occured: 15773951
0
0
0
0
0
0
0
0
0
4

2 回答 2

4

好的,所以:

1.

// Here you subtract from wc the integer value of the 
// character '1' (which is ~49)
numbers[wc-'1']++;

应该

numbers[wc-1]++;

2.

 // The array starts at index 1, ignoring the very first one ie. zero
 for(i=1; i<array_size; i++)

应该

 for(i=0; i<array_size; i++)

3.

 // Here you assign the value ' ' to the variable c, which is equivalent to do:
 // if((' ')||('\t')||('\n')){  which is equivalent to do:
 // if((' ' != 0)||('\t' != 0)||('\n' != 0)){ which is always true
 if((c=' ')||(c='\t')||(c='\n')){

应该

 if((c==' ')||(c=='\t')||(c=='\n')){
于 2013-06-24T19:21:02.440 回答
2

您将分配与相等性比较混为一谈......

if((c=' ')||(c='\t')||(c='\n')){

应该

if((c==' ')||(c=='\t')||(c=='\n')){

当然,您应该为此发出编译器警告...使用 gcc 您应该将 -Wall 添加到命令行,这样您就不必再次调试它。

有关所有可用警告选项的详细信息,请参阅gcc 警告选项。

于 2013-06-24T19:20:24.110 回答