2016-12-03 4 views
-1

Ich versuche ein Programm zu schreiben, das eine Textdatei eingibt und das häufigste Zeichen und wie oft findet. Ich bekam immer 0 für das Ergebnis. Hier ist mein Code:C Häufige Zeichen aus einer Textdatei finden

#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); 
} 

Dies ist die Ausgabe aus dem Code: Dateiname: text.txt Dateiinhalt: Der max Charakter ist:
Die Menge beträgt 0 Der max Charakter ist:
die Menge ist 0 der max Charakter ist:
die Menge 0 ist der maximale Charakter ist:
die Menge beträgt 0

+0

Die 'for' Schleife mit der Bedingung' str [i] = 0 'wird einmal als 'str ausgeführt werden [1]'' 0 '!. –

+0

Diese erste 'for'-Schleife wird überhaupt nicht ausgeführt (basierend auf Initialisierungswerten). Warum ist es da? – e0k

+0

Zuerst ist der Einzug korrekt. – BLUEPIXY

Antwort

0

int array[255] ist zu klein. Bereich für unsigned char ist von 0 bis einschließlich 255, so sollte es sein array[256]

Sie müssen einfach nur die Vorkommen jedes Zeichens zählen:

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

Beachten Sie, dass ch sollte als int deklariert werden, nicht char wessen Bereich negative Zahlen einschließt. Wenn Sie es als char deklariert haben, wird beim Lesen von Nicht-ASCII-Dateien ein Fehler verursacht. Sie können ch später zurück auf (char) umwandeln.

dann, welchen Charakter finden, ist am häufigsten:

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

ich empfehlen würde Tests für hartcodierte Dateinamen verwenden, zB const char *filename = "test.txt", wird es einfacher, den Code zu debuggen.

Beispiel:

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); 
} 
Verwandte Themen