0
votes

C Comment imprimer les éléments d'un tableau

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.


1 commentaires

Bien que vous ne devriez pas vraiment publier deux questions (sans rapport avec lui) comme une seule… le deuxième argument de fopen spécifie dans quel mode ouvrir le fichier: cppreference .


3 Réponses :


2
votes

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.


1 commentaires

Oui, mon erreur, difficile à taper sur un téléphone :)



1
votes

Essayez ceci, cela devrait fonctionner:

char* planets[7]={"Mercury", "  Venus", "   Mars", "Jupiter", " Saturn", " Uranus", "Neptune"};


1 commentaires

Bien que votre code fonctionnera 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 Ça fonctionne et / ou pourquoi le Le code de OP ne fonctionne pas.



3
votes

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.


0 commentaires