Цикл по массиву структур - PullRequest
       33

Цикл по массиву структур

1 голос
/ 30 октября 2009

У меня есть эта структура, и я подумал, что мог бы установить условие, если структура указывает на значение NULL.

Вот моя простая структура для этого примера:

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 */
};

Я думаю, мне следует увеличить массив emp_details и разыменовать указатель, чтобы увидеть, содержит ли он NULL в первом элементе массива. Но не уверен, что я иду в правильном направлении.

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

Ответы [ 4 ]

5 голосов
/ 30 октября 2009

Есть два разных способа обработки этого вида, и вы как бы перекрыли их оба!

Я предполагаю, что вы хотите остановиться, когда 'name' равно NULL.

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

или

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

Есть еще одна альтернатива. Вы не можете NULL в конце и получить размер emp_details, выполнив:

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

Однако я бы лично советовался против этого, так как на практике я нахожу это хрупким.

3 голосов
/ 30 октября 2009

Я предлагаю:

for ( i=0 ; emp_details[i].name != NULL ; i++)
{
    // do something
}
2 голосов
/ 30 октября 2009

Что вам нужно, это:

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

(Предполагается, что emp_details[i].data может иметь значение NULL, как при инициализации массива)

2 голосов
/ 30 октября 2009

Должно быть:

for(i=0; emp_details[i].name != NULL; i++) { 
    printf("Name: [ %s ] [ %s ]\n", emp_details[i].name, emp_details[i].data); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...