Pourquoi ce code n’imprime-t-il pas l’alphabet des minuscules comme prévu?

Le problème est de demander à remplir un tableau avec des lettres minuscules, puis à les imprimer. Ce que je reçois car les sorties sont en majuscule, en commençant par F et en passant 5 places après Z. Pourquoi?

#include  #include  int main(int argc, const char **argv) { char alphabet[27]; char i; for(i = 'a'; i <= 'z'; i++) printf("%c", &alphabet[i]); return 0; } 

Il y a deux problèmes avec vos codes.

  1. Vous n’initialisez jamais l’ char alphabet[27] . Vous n’obtiendrez jamais ce que vous voulez, vous l’initialisez.

  2. Supposons que vous l’initialisiez, vous pouvez faire ce qui suit

    for(i = 'a'; i <= 'z'; i++) printf("%c", &alphabet[i - 'a']);

  3. Si vous souhaitez simplement imprimer l'alphabet, vous pouvez simplement procéder comme suit:

    for(i = 'a'; i <= 'z'; i++) printf("%c", i);

La valeur de ‘a’ est 97. Ce que vous voulez faire est de définir initialement i sur 0. Regardez ici: http://www.asciitable.com/ .

En outre, vous souhaitez append des valeurs à votre tableau avant de l’utiliser dans la boucle. Quelque chose comme ça:

 int index = 0; while(index < 26) { alphabet[index] = index + 'a'; //or alphabet[index] = index + 97 ++index; } 

Je pense que ce code implémente ce qui est demandé – remplissez un tableau avec les lettres de l’alphabet puis imprimez-le.

 #include  int main(void) { char alphabet[27]; int i; for (i = 'a'; i <= 'z'; i++) alphabet[i - 'a'] = i; alphabet[i - 'a'] = '\0'; printf("alphabet: %s\n", alphabet); return 0; } 

(D'ailleurs, je vérifie ces choses avant de les poster, et dans ce cas, je suis très heureux de l'avoir fait. J'avais l' alphabet[i] = '\0'; après la boucle, mais cela est signalé comme une error: array subscript is above array bounds [-Werror=array-bounds] - et c'est vrai! Même un code simple qui "ne peut pas se tromper" peut se tromper. Ma ligne de commande GCC 7.1.0 - qui fonctionne avec de nombreuses autres versions de GCC, était: gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wssortingct-prototypes -Wold-style-definition x3.c -o x3 . Je recommande d'utiliser la plupart de ces options - au minimum, utilisez -Wall -Wextra -Werror .)

Ceci est similaire au code dans la question, mais ce n’est probablement pas la façon dont j’écrirais le code, en partie à cause de la piqûre qui m’a presque eu.

Une autre façon de le faire serait:

 #include  int main(void) { char alphabet[26]; int i; for (i = 0; i < 26; i++) alphabet[i] = i + 'a'; printf("alphabet: %.*s\n", 26, alphabet); return 0; } 

Notez que l' alphabet n'est pas une chaîne; il n'est pas terminé à zéro. La spécification de conversion %.*s en conjonction avec l'argument 26 garantit que 26 caractères au maximum sont imprimés; Peu importe que l' alphabet ne soit pas une chaîne. Bien sûr, en utilisant un tableau et un alphabet[i] = '\0'; légèrement plus grands alphabet[i] = '\0'; après la boucle - analogue à l'autre code - fonctionnerait aussi proprement sans la complexité supplémentaire de la printf() format printf() .

Laissée à moi-même, j'utiliserais probablement la version à terminaison nulle du deuxième exemple de programme.

Lisez la spécification POSIX de printf() pour plus de détails. Il a quelques extensions (clairement marquées) sur la norme C printf() , mais il sert à la fois pour POSIX et la norme C. Ensuite, relisez-le. Et relisez-le. Et faites cela quotidiennement pendant une semaine, puis hebdomadairement pendant un mois, puis mensuellement pendant un an, puis tous les ans. Il va rembourser l'effort. Et de même pour scanf() , qui est encore plus difficile à utiliser que printf() .

Il y a un problème ici: vous n’avez pas initialisé l’alphabet et ne l’avez jamais utilisé. Si vous souhaitez uniquement imprimer les valeurs, vous n’avez pas à utiliser le tableau, comme suit:

 for(int i = 'a'; i <= 'z'; i++) printf("%c", i); 

Si vous souhaitez également remplir le tableau, faites-le d'abord et ensuite, imprimez les valeurs.