11
votes

Tableaux de chaîne en C

J'ai un éventail de chaînes qui, lorsque je itérayez et imprimez ses éléments me donne des résultats inattendus.

EURGBPUSDJPYCNY - GBPUSDJPYCNY - USDJPYCNY - JPYCNY - CNY -


2 commentaires

tout compilateur décent devrait donner une erreur ou au moins un avertissement pour cela


@CHAPPER, @Martani: Je n'ai pas de copie de la norme C près de la main, mais je pense que la chute silencieusement de l'octet nul dans ce cas est explicitement autorisée par la norme. Au moins à la fois, il y aurait eu une quantité raisonnable de code qui utilisait cette technique pour initialiser les matrices de caractères de taille du correctif, car il est beaucoup plus concis que simplement énumérer les valeurs de caractère un par un.


6 Réponses :


14
votes

Vous manquez les terminateurs nul les chaînes sont en réalité de 4 caractères. Chaque chaîne est ensuite sur l'écriture de la terminaison NULL de la chaîne précédente *. Essayez à la place:

char currencies[][4] = {"EUR", "GBP", "USD", "JPY", "CNY"}; 


3 commentaires

Oui, ce sera-t-il ... Vous devez autoriser l'espace dans votre réseau pour le terminateur NULL ainsi que le contenu actuel ...


Éphémique, cela ne fonctionne pas (c'est une erreur de compilation). Vous devez déclarer la taille de tous sauf la dimension la plus gauche (le compilateur doit savoir combien de temps une ligne est de gérer l'indexation).


C'est vrai, sauf que chaque chaîne ne laisse pas "écraser le terminateur null de la chaîne précédente" - les terminateurs nul ne sont jamais écrits du tout, car les matrices étant initialisées ont seulement 3 caractères chacun. (C'était une fluoche complète que le dernier tableau soit suivi d'un terminateur du tout).



2
votes

Changer xxx pré>

à p>

char currencies[][4]


0 commentaires

8
votes

Vous le déclarez faux. Cela fonctionnera. Il laisse simplement le compilateur mettre en place un éventail de pointres-const-caractères: xxx

éditer: en faisant une matrice à deux dimensions, comme la réponse de Charles Beattie, fonctionne aussi, à condition que vous alloue. espace pour le null. Spécifiez également que les caractères sont const , par christoph.


3 commentaires

En fait, les deux fonctionnent (si vous laissez de l'espace pour la résiliation zéro dans le code d'origine), mais votre version pourrait être meilleure car les compilateurs auront un temps plus facile d'optimiser cela; Dans les deux cas, vous devriez ajouter const qualificatifs, bien que


Les deux déclarations sont différentes. Dans le cas de l'OP, il déclare un tableau double Chary, où votre déclaration est une matrice de Cons-Pointants. Donc, dans votre cas, il ne peut pas modifier le contenu de la matrice, je veux dire qu'il ne peut pas faire de choses comme des devises [0] [1] = 'x';


C'est vrai, chappar. On n'a pas l'air d'avoir l'intention de le modifier.



0
votes

Bien sûr. "EUR" est de quatre caractères - trois pour les lettres, une pour le caractère null de terminaison. Puisque vous spécifiez explicitement des tableaux de trois caractères, le compilateur tronque et que vos données sont donc enfilées. Vous avez de la chance, il y a apparemment un caractère zéro à la fin de la matrice, ou vous pourriez avoir toutes sortes de poubelles. Changez votre déclaration à Char Devises [] [4] .


0 commentaires

0
votes

mon C est assez rouillé, mais essayez:

char currencies[][3] = {"EUR\0", "GBP\0", "USD\0", "JPY\0", "CNY\0"};


2 commentaires

Le compilateur devrait émettre un avertissement.


Il en va de même que vos cordes ont 5 caractères de long. "EUR \ 0" est égal {'E', 'U', 'R', '\ 0', '\ 0'}



2
votes

Vous n'avez pas de gamme de chaînes, mais un tableau de tableau-de-Char. Vous pouvez utiliser: xxx

pour permettre des chaînes de différentes longueurs.


0 commentaires