2017-05-22 1 views
0

Ich weiß, diese Frage wurde oft gestellt, aber ich kann nicht herausfinden, was ich falsch mache. Ich bitte den Benutzer, eine Zeichenfolge einzugeben und zu zählen, wie oft ein Zeichen in der Zeichenfolge angezeigt wird. Dies ist mein Code:C zählen die Anzahl der Vorkommen in Zeichenfolge

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 

int main() 
    { 

    char alphabetLower [26]; 
    int alphabetLowerNumbers [26]; 
    int alphabetUpperNumbers [5]; 
    char userInput[30]; 


    // store alphabet in array 
    for(int i =0; i < 26; i++) 
    { 
     char character = (97 + i); 
     alphabetLower[i] = character; 
    } 

    // assign alphabet number arrays to 0 
    for(int i=0; i < 5; i++) 
    { 
     alphabetLowerNumbers[i] = 0; 
     alphabetUpperNumbers[i] = 0; 
    } 

    puts("enter a string"); 
    fgets(userInput, 30, stdin); 

    for(int i=0; i < 30; i++) 
    { 

     int ascii = userInput[i]; // ascii 

     alphabetLowerNumbers[ascii - 97]++; 


    } 

    for(int i=0; i < 26; i++) 
    { 
     printf("%c: ", alphabetLower[i]); 
     printf("%d\n", alphabetLowerNumbers[i]); 
    } 



    return 0; 
} 

Jedes Mal, wenn ich es ausführen, druckt es die Anzahl der Vorkommen bis zum Buchstaben ‚f‘ aus. Danach sind die Ergebnisse falsch und für einige Buchstaben werden Zufallszahlen ausgedruckt. Kann mir bitte jemand helfen, das zu beheben und mir zu erklären, was ich falsch mache? Vielen Dank.

enter a string 
abc 
a: 1 
b: 1 
c: 1 
d: 0 
e: 0 
f: 32767 
g: 1 
h: 0 
i: 1434561216 
j: 32767 
k: 206176841 
l: 1 
m: 1434561248 
n: 32767 
o: 1434561248 
p: 32767 
q: 1434561272 
r: 32767 
s: 171855872 
t: 1 
u: 0 
v: 1 
w: 206173472 
x: 1 
y: 206173376 
z: 1 
+1

'for (i = 0 int; i <5; i ++)' Warum wollen Sie nur init bis zu 4? Das scheint Ihrem 'f' Problem zu entsprechen. – kaylum

+0

@ kaylum Ich habe vergessen, das zu ändern. Ich habe das Programm zunächst mit 5 Buchstaben getestet. Vielen Dank. – rissandimo

+0

@rissandimo Also ist das dein Problem oder nicht? – kaylum

Antwort

1

Sie initialisieren nur die ersten fünf Buchstaben.

// assign alphabet number arrays to 0 
for(int i=0; i < 5; i++) 
{ 
    alphabetLowerNumbers[i] = 0; 
    alphabetUpperNumbers[i] = 0; 
} 

sollte

seine
// assign alphabet number arrays to 0 
for(int i=0; i < 26; i++) 
{ 
    alphabetLowerNumbers[i] = 0; 
    alphabetUpperNumbers[i] = 0; 
} 
+1

Hinweis: Die Deklaration von 'alphabetUpperNumbers' muss auch die Array-Größe erhöhen; Im Moment hat es nur fünf Elemente, also würde die Initialisierung von mehr als fünf zu undefiniertem Verhalten führen. – ShadowRanger

+0

@ShadowRanger Ich wollte die Logik Schritt für Schritt ausschreiben. Jetzt, da das untere Alphabet korrekt funktioniert, beende ich das Programm, um die Buchstaben zu akzeptieren, die ebenfalls alphabetisiert sind. – rissandimo

0

Der Hauptnachteil des Programms wird mit magischen Zahlen, wie zum Beispiel 97 oder 5.

In dieser Schleife

for(int i=0; i < 5; i++) 
{ 
    alphabetLowerNumbers[i] = 0; 
    alphabetUpperNumbers[i] = 0; 
} 

nur 5 Elemente des Arrays alphabetLowerNumbers initialisiert. Alle anderen Elemente des Arrays haben unbestimmte Werte.

. (Anmerkung: Sie können das Array in der Deklaration initialisieren stattdessen eine Schleife der Verwendung zum Beispiel

int alphabetLowerNumbers [26] = { 0 }; 

)

Der String userInput kann weniger Zeichen als seine Kapazität. Außerdem kann es den abschließenden Nullpunkt '\0' und das neue Zeilenzeichen '\n' enthalten. Also diese Schleife.

for(int i=0; i < 30; i++) 
{ 

    int ascii = userInput[i]; // ascii 

    alphabetLowerNumbers[ascii - 97]++; 

} 

führt zu undefiniertem Verhalten des Programms.

Zumindest sollte die Schleife aussehen

for (size_t i = 0; userInput[i] != '\0' && userInput[i] != '\n'; i++) 
{ 
    //... 
} 
Verwandte Themen