2009-10-30 10 views
1

J'ai cette structure et je pensais pouvoir définir la condition si la structure pointe vers une valeur NULL.Looping à travers un tableau de structures

Voici ma structure simple pour cet exemple:

typedef struct 
{ 
    char *name; 
    char *data; 
} details_t; 


details_t emp_details [] = 
{ 
    { "peter", "lawyer" }, 
    { "john", NULL }, /* No data for john */ 
    { NULL, NULL }, /* Indicates last element in the array */ 
}; 

Je pense que je devrais augmenter le tableau emp_details et déréférencement le pointeur pour voir si elle contient une valeur NULL dans le premier élément de tableau. Mais je ne sais pas si je vais dans la bonne direction.

for(i=i; *emp_details; i++) 
{ 
    printf("Name: [ %s ] [ %s ]\n", emp_details[i].name, emp_details[i].data); 
} 

Répondre

5

Vous pouvez gérer ce look de deux manières différentes, et vous les avez toutes deux superposées!

Je suppose que vous voulez arrêter lorsque 'name' est NULL.

for(details_t* it = emp_details; (*it).name != NULL; it++) 
    { printf("..", (*it).name, (*it).data); } 

ou:

for(int i = 0; emp_details[i].name != NULL; i++) 
    { printf("..", emp_details[i].name, emp_details[i].data); } 

Il y a une autre alternative. Vous ne pourriez pas une valeur NULL à la fin, et obtenir la taille de emp_details en faisant:

int size_of_array = sizeof(emp_details)/sizeof(details_t); 

Cependant, personnellement, je conseille contre cela, car je trouve qu'il est fragile dans la pratique.

+3

Puis-je suggérer d'utiliser '->' au lieu de '(*) .'? – mouviciel

+1

En plus de l'utilisation de '->' au lieu de '(*) .', n'oubliez pas de vérifier' it-> data! = NULL' avant d'essayer de l'utiliser. Sinon, "john" pourrait bien provoquer 'printf()' (ou quelque chose d'autre). –

+1

@Chris Jefferson Une raison pour laquelle 'int size_of_array = sizeof (emp_details)/sizeof (details_t);' fragile? une expérience personnelle que vous voulez partager? –

2

devrait être:

for(i=0; emp_details[i].name != NULL; i++) { 
    printf("Name: [ %s ] [ %s ]\n", emp_details[i].name, emp_details[i].data); 
} 
2

Qu'est-ce que vous avez besoin est:

for(i=i; emp_details[i].name; i++) 
{ 
    printf("Name: [ %s ] [ %s ]\n", emp_details[i].name, emp_details[i].data); 
} 

(Cela suppose que emp_details[i].data est autorisé à être NULL, comme dans l'initialisation de votre tableau)

3

Je suggère:

for (i=0 ; emp_details[i].name != NULL ; i++) 
{ 
    // do something 
} 
+0

gentil et simple :) – warren

Questions connexes