Bien que le titre semble que j'imprime simplement un tableau, ce n'est pas tout à fait cela. Voici le code:
Mercury Venus MarsJupiter Saturn UranusNeptune\365\277\357\376: 75.6 Venus MarsJupiter Saturn UranusNeptune\365\277\357\376: 181.4 MarsJupiter Saturn UranusNeptune\365\277\357\376: 75.4 Jupiter Saturn UranusNeptune\365\277\357\376: 472.0 Saturn UranusNeptune\365\277\357\376: 183.2 UranusNeptune\365\277\357\376: 177.8 Neptune\365\277\357\376: 224.0
Mon objectif ici est d'imprimer
Mercury: xxx.x Venus: xxx.x
etc.
Cependant, mon code imprime ceci:
#include <stdio.h>
int main(int argc, const char * argv[]) {
char planets[7][7]={"Mercury", " Venus", " Mars", "Jupiter", " Saturn", " Uranus", "Neptune"};
float weights[7]={(200*37.8*0.01),(200*90.7*0.01),(200*37.7*0.01),(200*236.0*0.01),(200*91.6*0.01),(200*88.9*0.01),(200*112.0*0.01)};
for (int i=0; i<7; i++) {
printf("%s: %3.1f\n",planets[i], weights[i]);
}
}
Qu'est-ce que c'est, pourquoi imprime-t-il tout mon tableau tout le temps, quels sont les nombres comme \ 365 \ 277 \ 357 \ 376 faire à la fin? Je suis tellement confus.
3 Réponses :
Faites-en char planets [7] [8] . Lorsque vous définissez la taille du tableau sur le nombre exact de lettres dans les chaînes, il ne reste plus de place pour le symbole null . Donc, printf ne sait pas où se terminent vos chaînes.
Oui, mon erreur, difficile à taper sur un téléphone :)
Essayez ceci, cela devrait fonctionner:
char* planets[7]={"Mercury", " Venus", " Mars", "Jupiter", " Saturn", " Uranus", "Neptune"};
Bien que votre code fonctionnera i> du travail, il est généralement meilleur, lors de la publication d'une réponse sur le débordement de la pile, d'offrir au moins une brève explication de pourquoi i> Ça fonctionne et / ou pourquoi le Le code de OP ne fonctionne pas.
Le problème avec votre code est que vous n'attribuez pas suffisamment d'espace dans votre tableau planètes pour contenir les noms donnés!
Par exemple, la chaîne littérale, "Mercury" est en fait un tableau de huit char éléments: les sept lettres < em> plus le NUL terminator (toutes les chaînes de C doivent avoir ce signal de terminaison «zéro octet» et le compilateur en ajoutera automatiquement un à n'importe quelle chaîne littérale / constante donnée).
Changez simplement vos planètes [7] [7] en planètes [7] [8] et le code fonctionnera.
EDIT: Ce que vous voyez dans votre sortie est un exemple du redoutable Comportement indéfini ! Comme il n'y a pas de terminateur NUL dans chaque chaîne, l'appel printf continue d'imprimer des caractères supplémentaires après la 'fin' du nom de la planète, jusqu'à ce qu'il trouve un char < / code> qui vaut zéro. Vos sept noms de planètes sont en mémoire contiguë , donc, à chaque boucle, le printf "déborde" dans le nom de la planète suivante. Après avoir atteint la fin de "Neptune", il commence alors à interpréter la mémoire qui n'a pas été définie comme des données char comme des octets individuels - et ni vous ni moi ne pouvons vraiment prédire quelles seront ces valeurs de mémoire: d'où un comportement indéfini.
Bien que vous ne devriez pas vraiment publier deux questions (sans rapport avec lui) comme une seule… le deuxième argument de
fopenspécifie dans quel mode ouvrir le fichier: cppreference .