2017-05-22 4 views
0

Je sais que cette question a été posée plusieurs fois, mais je ne peux pas comprendre ce que je fais mal. Je demande à l'utilisateur d'entrer une chaîne, et compte le nombre de fois qu'un caractère apparaît dans la chaîne. Ceci est mon code:C compte le nombre d'occurrences dans la chaîne

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

Chaque fois que je l'exécute, il imprime le nombre d'occurrences jusqu'à la lettre « f ». Après cela, les résultats sont incorrects et pour certaines lettres, il imprime des nombres aléatoires. Quelqu'un peut-il me guider s'il vous plaît comment résoudre ce problème et m'expliquer ce que je fais mal? Merci.

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 (int i = 0; i <5; i ++)' Pourquoi est-ce que vous ne initialisation jusqu'à 4? Ce qui semble correspondre à votre problème 'f'. – kaylum

+0

@kaylum J'ai oublié de changer cela. Je testais le programme initialement avec 5 lettres. Merci. – rissandimo

+0

@rissandimo Alors c'est votre problème ou pas? – kaylum

Répondre

1

Vous initialisez uniquement les premiers nombres de cinq lettres.

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

devrait être

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

Remarque: La déclaration de 'alphabetUpperNumbers' doit également augmenter la taille du tableau; Pour le moment, il n'a que cinq éléments, donc initialiser plus de cinq invoquerait un comportement indéfini. – ShadowRanger

+0

@ShadowRanger Je voulais écrire la logique étape par étape. Maintenant que l'alphabet inférieur fonctionne correctement, je vais terminer le programme pour accepter les caractères alphabétisés. – rissandimo

0

Le principal inconvénient du programme utilise des nombres magiques comme par exemple 97 ou 5.

Dans cette boucle

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

y sont initialisés seulement 5 éléments de la matrice alphabetLowerNumbers. Tous les autres éléments du tableau ont des valeurs indéterminées.

(. Remarque: vous pouvez initialiser le tableau dans sa déclaration au lieu d'utiliser une boucle Par exemple

int alphabetLowerNumbers [26] = { 0 }; 

)

La chaîne userInput peut contenir moins de caractères que sa capacité. Et de plus il peut contenir le zéro de fin '\0' et le nouveau caractère de ligne '\n'. Donc cette boucle.

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

    int ascii = userInput[i]; // ascii 

    alphabetLowerNumbers[ascii - 97]++; 

} 

entraîne un comportement indéfini du programme.

Au moins la boucle devrait ressembler

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