2013-07-12 67 views
-2

練習對K&R練習1-13

「編寫一個程序來打印輸入中單詞長度的直方圖」。

下面是在C答案書給出了答案。出於某種原因,它在CodeBlocks中不起作用,因爲在輸入我的輸入時沒有任何輸出。這是爲什麼?

另一個問題是關於wl[i];那是什麼?

#include <stdio.h> 

#define MAXHIST 15 
#define MAXWORD 11 
#define IN  1 
#define OUT  0 

main() 
{ 
    int c, i, nc, state; 
    int len; 
    int maxvalue; 
    int ovflow; 
    int wl[MAXWORD]; 

    state = OUT; 
    nc = 0; 
    ovflow = 0; 
    for(i=0; i < MAXWORD; ++i) 
     wl[i] = 0; 
    while((c = getchar()) !=EOF) { 
     if (c==' '|| c=='\n'|| c == '\t'){ 
      state = OUT; 
      if (nc>0) 
       if (nc < MAXWORD) 
        ++wl[nc]; 
       else 
        ++ovflow; 

      nc=0; 
     }else if (state == OUT){ 
      state = IN; 
      nc = 1; 
     }else 
      ++nc; 
    } 
    maxvalue = 0; 
    for (i = 1; 1<MAXWORD; ++i) 
     if (wl[i] > maxvalue) 
      maxvalue = wl[i]; 

    for (i=1; i<MAXWORD; ++i){ 
     printf("%5d - %5d : ", i, wl[i]); 
     if (wl[i]> 0){ 
      if ((len=wl[i] * MAXHIST/maxvalue) <=0) 
       len = 1; 
     }else 
      len = 0; 
     while (len > 0) { 
      putchar('*'); 
      --len; 
     } 
     putchar('\n'); 
    } 
    if (ovflow > 0) 
      printf("There are %d words >= %d\n", ovflow, MAXWORD); 
} 
+0

你有沒有試着用*啓用所有*警告編制? – Kevin

+2

如果你想問什麼是數組下標,你需要真正閱讀一些關於C的書。如果你不明白你在做什麼,你永遠不會解決你的問題。 – siride

+0

K&R不算是一本關於C的書嗎?謝謝澄清,不知道是數組下標。 @Kevin我已啓用所有警告,但我仍然面臨同樣的問題。 – MethequalsMath

回答

3

此行是錯誤的:

for (i = 1; 1 < MAXWORD; ++i) 

第二1i,當然。在1不小於11之前將是很長的時間。另一方面,然後你會閱讀所有內存,遲早你會閱讀一些不可讀的內容,然後程序就會崩潰。有可能它不會崩潰,但行爲是未定義的,所以發生的任何事情都可以。