7
votes

En boucle d'une matrice de taille fixe sans définir sa taille en C

Quelque exemple de code pour démarrer la question:

int i = FOO_COUNT;
while (--i >= 0) {
 printf("%s\n", foo[i]);


0 commentaires

8 Réponses :


17
votes
int i = sizeof(foo)/sizeof(foo[0]);

8 commentaires

Cela fonctionnerait-il toujours si les pointeurs de caractères de FOO ont pointé sur des chaînes de caractère de taille variable?


Donc, si un élément dépasse 15 caractères, ce chèque échouera? Probablement mieux d'utiliser la sentinelle null alors? Merci encore.


Cela ne manquera pas. taille de [foo [0]) ==> Tailleof (Char *); Le nombre de caractères n'a pas d'importance.


OK, n'était pas sûr de ce que vous parlez de 15 limite de charcuterie dans votre commentaire ci-dessus


La partie limite de chargement du commentaire signifie qu'il s'agissait simplement d'ajouter des caractères supplémentaires pour répondre au minimum de 15 caractères pour commentaires dans le débordement de la pile. Sa réponse comme juste "oui", mais la pile trop-fleuve n'aime pas les commentaires qui courtes.


Notez que i ci-dessus est une constante de temps de compilation, vous pouvez donc faire: #define n taille de foo FOO / TIMEDOF FOO [0] suivi de Int Data [n ]; . Qui est valide même pour C89. De plus, les parenthèses ne sont pas requises si Tailleof est utilisé avec une valeur au lieu d'un type.


La première phrase ci-dessus devrait être lue: "... le RHS dans la définition de i est une constante de temps de compilation".


Désolé pour la confusion. Merci @brian Campbell pour clarifier ce que je voulais dire.



0
votes

oui.

Taille de (FOO) / Tailleof (Char *)

est 5.


0 commentaires

2
votes

La façon habituelle de le faire est de mettre fin à la matrice avec NULL et ITERE jusqu'à ce que vous frappiez cela.


0 commentaires

2
votes

Oui.

int i = sizeof(foo) / sizeof(char*);


0 commentaires

12
votes

Utilisez une sentinelle à la fin, telle que NULL:

static const char *foo[] = {
       "123",
       "456",
       "789",
       "987",
       "654",
       NULL
};

for (char *it = foo[0]; it != NULL; it++)
{
        ...
}


0 commentaires

2
votes
size_t i = sizeof foo / sizeof *foo; // or sizeof foo / sizeof foo[0]
This divides the total number of bytes in the foo array (sizeof foo) by the number of bytes in a single element (sizeof *foo), giving the number of elements in the array.  

0 commentaires

2
votes

Il existe également une autre méthode en C99, surtout si vous souhaitez nommer des index, permettant une localisation d'instance, etc. xxx

à l'aide de l'initialiseur nommé, le programme est toujours correct, même si une valeur ENum change . xxx

ou n'importe où dans le programme avec l'index nommé xxx

Cette technique peut être utilisée pour simuler des paquets de Ressource. Déclarez un Enum et plusieurs matrices de chaîne avec des variantes de langue et utilisez un pointeur dans le reste du programme. Simple et rapide (surtout sur des machines 64 bits lorsque l'adresse d'une constante (chaîne) peut être relativement coûteuse. EDIT: La taille de FOO / TIMITEF * FOO TECHNIQUE fonctionne toujours avec ceci.


0 commentaires

0
votes

Pour une application, Essayez et Catch fonctionnerait.


1 commentaires

Même si c avait essayez et attraper , je ne vois pas comment ils sont pertinents pour itération sur un tableau.