2016-12-03 81 views
-1

我正在嘗試編寫一個程序,該程序需要輸入一個文本文件並查找最頻繁的字符以及多少次。結果我一直得到0。這裏是我的代碼:C從文本文件中查找頻繁字符

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
FILE *fp; 
char *filename; 
char ch; 
int array[255] = {0}; 
char str[]= ""; 
int i, max, index; 


// Check if a filename has been specified in the command 
if (argc < 2) 
{ 
    printf("Missing Filename\n"); 
    return(1); 
} 
else 
{ 
    filename = argv[1]; 
    printf("Filename : %s\n", filename); 
} 

// Open file in read-only mode 
fp = fopen(filename,"r"); 

    // If file opened successfully, then print the contents 
    if (fp) 
    { 
    printf("File contents:\n"); 
    while ((ch = fgetc(fp)) != EOF) 
     { 
      for (i = 0; i < 255; i++){ 
     ch = str[i]; 
    } 

// Find the letter that was used the most 
for(i = 0; str[i] != 0; i++) 
{ 
++array[str[i]]; 
} 
max = array[0]; 
index = 0; 
for(i = 0; str[i] != 0; i++) 
{ 
if(array[str[i]] > max) 
{ 
    max = array[str[i]]; 
    index = i; 
    } 
} 

printf("The max character is: %c \n", str[index]); 
printf("The amount is %d\n", max); 
     } 

    } 
else 
    { 
    printf("Failed to open the file\n"); 
    } 

return(0); 
} 

這是從代碼的輸出: 文件名:的text.txt 文件內容: 最大特點是:
量爲0 最大特點是:
量爲0 的最大特點是:
的量爲0 的最大特點是:
的量爲0

+0

的'for'循環與條件'STR [1] = 0'將被作爲'STR運行一次[1]''是0'!。 –

+0

首先'for'循環根本不會運行(根據初始化值)。爲什麼在那裏? – e0k

+0

首先,縮進是正確的。 – BLUEPIXY

回答

0

int array[255]太小。範圍unsigned char是從0到和包括255,所以它應該是array[256]

你只需要計算每個字符的出現:

while((ch = fgetc(fp)) != EOF) 
    array[ch]++; 

注意ch應被聲明爲int,不char其範圍包括負數。讀取非ASCII文件時,聲明爲char將導致錯誤。您可以稍後將ch投射回(char)

然後找哪個字符是最常見的:

int most_common_char = 0; 
for(i = 1; i < 256; i++) 
    if(array[i] > array[most_common_char]) 
     most_common_char = i; 

我會建議使用硬編碼的文件名進行測試,例如const char *filename = "test.txt",它會更容易調試代碼。

實施例:

int main() 
{ 
    const char *filename = "test.txt"; 
    FILE *fp; 
    int ch; 
    int array[256] = { 0 }; 
    int i; 
    int most_common_char; 

    fp = fopen(filename, "r"); 
    if(!fp) 
    { 
     printf("Failed to open the file\n"); 
     return 0; 
    } 

    while((ch = fgetc(fp)) != EOF) 
     array[ch]++; 

    most_common_char = 0; 
    for(i = 1; i < 256; i++) 
     if(array[i] > array[most_common_char]) 
      most_common_char = i; 

    printf("most common character: %c\n", (char)most_common_char); 

    return(0); 
}