2016-10-25 38 views
1

我正在計算文件中的字符數並以十六進制顯示它們。 爲例:「A」以十六進制計算文件中的字符

「N」的情況下

5個實例「」

我不想輸出沒有在文件中appered,因此不字符我陣列。我想輸出文件中的實例。

我不知道如何打印,因爲我不希望輸出的「東西」的「0」情況已發生每個實例。

#include <stdio.h> 

int main(int argc, char const *argv[]) { 
    int c; 
    FILE *f = fopen(argv[1], "r"); 
    int totalchars[256] = { 0 }; 
    while ((c = getc(f)) != EOF) { 
     if (totalchars[c] == 0) 
      totalchars[c] = 1; 
     else 
      totalchars[c]++; 

    } // while 

    for (int i = 0; i < 256; i++) 
     printf("%d instances of character %x\n", totalchars[i], c); 

    return 0; 
} 

我知道打印時,c是在文件的末尾,所以它會打印ffffffff。我不知道如何輸出我想要的內容。任何幫助表示讚賞

+0

經常檢查(!= NULL)從'的fopen()',以保證手術成功 – user3629249

+0

未被超越'argv的訪問返回值[0]'沒有檢查'argc'以保證命令行參數實際上進入。 – user3629249

回答

0

您使用了錯誤的變量,複製時要小心,並粘貼

printf("%d instances of character %c\n", totalchars[i], i); 
/*             ^
*         should be `i' not `c' 
*/ 
4

首先,你不需要

if (totalchars[c] == 0) 
    totalchars[c] = 1; 
else 
    totalchars[c]++; 

只是說

totalchars[c]++; 

添加1會將0更改爲1,並將它更改(說)將5更改爲6.我假設您將if (totalchars[c] == 0)在這裏測試,因爲你不想打印0的計數,但它是錯位的。 (見下文。)

其次,需要

for(int i = 0; i < 256; i++) 
    printf("%d instances of character %x\n", totalchars[i], i); 

,使得對於每一個(最多)在陣列中256個時隙,您打印就會計算用於該時隙(i)的字符,不要重複從文件中讀取的最後一個EOF字符(c)。

最後,當你打印出來的陣列,它的時間來測試是0計數,並抑制他們的。因此,它看起來就像這樣:

for(int i = 0; i < 256; i++) { 
    if(totalchars[i] != 0) { 
     printf("%d instances of character %x\n", totalchars[i], i); 
    } 
} 

附錄:在回答你連打的問題,產量可能更爲有用,如果它也包括了字符作爲本身:

 printf("%d instances of character %x: %c\n", totalchars[i], i, i); 

這有儘管如此,它還是會嘗試打印特殊字符,如空格,製表符和換行符等,但這些字符並不總是看起來很正確。

+0

如何在印刷過程中顯示角色? – guy

+0

@guy我以爲你想要它在十六進制!但看到我修正的答案。 –

+0

這只是出於興趣,並感謝你 – guy