Pour la boucle scanne une fois de moins en c

L’utilisateur entre une chaîne de caractères, mais avant cela, il entre la taille de la chaîne. Ensuite, je dois lire et compter combien de fois chaque lettre est entrée.

Voici mon code:

#include  char ab[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; //Size = 26 int main(void) { int i, j, size, counter[26]; char temp; for(i=0; i<26; i++) { counter[i]=0; } scanf("%d",&size); for(i=0; i<size; i++) { scanf("%c",&temp); for(j=0; j<26; j++) { if(ab[j]==temp) { counter[j]++; break; } } } for(i=0; i<26; i++) { printf("We have %d %c\n",counter[i],ab[i]); } return 0; } 

Et voici mon problème:
Dans le code donné, la boucle for qui lit s’exécute une dernière fois. Ainsi, par exemple, si vous entrez 7, il sera exécuté 6 fois au lieu de 7, même s’il commence à 0. Savez-vous quel est le problème?

     for(i=0; i 

    boucle 7 fois lorsque la size est 7.

    Votre problème est le suivant:

    Vous entrez un numéro pour

     scanf("%d",&size); 

    et appuyez sur Entrée . Le scanf ci-dessus scanne le nombre et laisse le caractère de nouvelle ligne ( '\n' ) dans le stream d’entrée standard. Dans la première itération de la première boucle,

     scanf("%c",&temp); 

    voit le caractère de nouvelle ligne et le consum ainsi, ce qui vous fait penser que la boucle s'exécute 1 fois de moins. Vous pouvez le vérifier en ajoutant

     printf("Got '%c'", temp); 

    après le scanf dans la boucle.

    Fixez-le en utilisant

     scanf(" %c",&temp); 

    L'espace avant %c ignore tous les caractères d' espacement, y compris aucun, jusqu'au premier caractère qui n'en est pas un.

    Le problème est que %c ne saute pas les espaces, contrairement aux formats numériques tels que %f et %d .

    Le scanf suivant peut être utilisé pour sauter un espace, puis lire le prochain caractère non blanc.

    scanf (“% * [\ n \ t]% c”, & temp);

    Le * dit jeter ce qui est lu, ne le stockez pas dans une variable de sortie. Le dit [...] lit toute séquence de caractères correspondant aux caractères entre crochets, dans ce cas, espace, nouvelle ligne ou tabulation.

    Changez votre code en

     #include  int main(void) { char ab[] = "abcdefghijklmnopqrstuvwxyz", temp; int i, j, size, counter[26] = {0}; scanf("%d", &size); for (i = 0; i <= size; ++i) { // One more iteration for the loop scanf("%c", &temp); for (j = 0; j < 26; ++j) { if (ab[j] == temp) { counter[j]++; break; } } } for (i = 0; i < 26; ++i) printf("We have %d %c\n", counter[i], ab[i]); return 0; } 

    Cependant, préférez lire la chaîne en une fois plutôt que de lire caractère par caractère

     char str[size + 1]; scanf("%s", str);