2013-06-24 15 views
1

我目前正在通過K & R,我已經成爲卡住,在搜索網絡後,再次嘗試,並搜索更多我來到stackoverflow爲幫幫我!使用getchar時奇怪的行爲,計算一個字的字符數

的任務是創建一個直方圖,該直方圖聚合每個單詞中的字母數,然後將該信息顯示爲直方圖。

我已經想出了直方圖部分,但是我在計算單詞時遇到了問題。

當我輸入幾個字,然後按Ctrl + D發送EOF,並打印每個字符輸入的出現次數;我與索引大值[0] noramlly以防萬一「15773951」

只是爲了澄清我的代碼將不斷加入到廁所返回,用於計算字符,直到一個空格,換行或選項卡found.it將值然後使用一個數組來存儲每個字大小發生的次數,方法是增加與字大小相等的索引位置。

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 
+0

你爲什麼不分配給零'號[0]'? if((c ='')||(c ='\ t')||(c ='\ n')){':「=」而不是「==」中的另一個錯誤。 –

+1

另外,請注意代碼'numbers [wc-'1'] ++;'是危險的,你應該檢查索引是否大於或等於數組的長度,否則你會得到討厭的記憶錯誤。 (這也造成了很多安全漏洞......) –

+0

感謝那裏的金塊科林! – Babbleshack

回答

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')){ 
+0

謝謝,其中2人發生了,因爲我在調試時跑出了主意 – Babbleshack

+0

很高興幫助:) –

2

你混合分配了相等比較....

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

應該

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

當然,你應該有一個編譯器警告...使用gcc你應該添加-Wall到命令行,所以你不必再次調試。

有關所有可用警告選項的詳細信息,請參見gcc warning options

+0

aww男人我現在感覺很傻,謝謝加載,並且我應該只用-Wall選項重新編譯來添加警告? – Babbleshack

+0

是的,添加-Wall選項,並希望你會得到警告。然後你可以修復它。對於這些容易犯的錯誤總是很好的警告。 –

+0

再次感謝,獲得有關編譯器選項信息的任何鏈接? – Babbleshack