2012-02-14 4 views
0

У меня есть две версии той же функции, и я не уверен, какой из двух я должен выбрать. Они делают то же самое, но мне интересно, есть ли «правильный путь» для этого, или это только вопрос эстетики.Самый простой способ пройти через список указателей?

//both functions have to start at the second element 
int multiFileHandler_1(char **files, int filenumber) 
{ 

filenumber = filenumber - 1; 
*files++; 
while(filenumber--) 
{ 
printf("%s\n", *files); 
fileOpen(*files); 
} 
return EXIT_SUCCESS; 
} 



int multiFileHandler_2(char **files, int filenumber) 
{ 
    char **file; 
    for (file = &files[1]; *file != '\0'; file++) 
    { 
     printf("%s\n", *file); 
     fileOpen(*file); 
    } 
    return EXIT_SUCCESS; 
} 

Я читал читал несколько текстов о читаемости кода и несколько подался к использованию for, поскольку он помещает всю важную информацию в одном блоке. Но версия while выглядит немного аккуратно.

EDIT: Ах, stackoverflow - это довольно обучающий опыт. Показывает, сколько я n00b. : P

+2

Если вы считаете, что версия 'while' выглядит более аккуратной, используйте версию' while'. –

+0

Две петли делают разные вещи. –

+1

'for (file = & files [1]; * file! = '\ 0'; file ++)' нуждается в гарантированном разделителе в последнем поле char * \ 0 '(в противном случае он заканчивается), что необязательно в первой версии. Таким образом, нет эстетики, кроме синтаксических различий. – Bort

ответ

1

С первым циклом вы зависите от второго аргумента, filenumber, чтобы перебирать список. Во втором примере для определения конца списка используется нуль-терминатор, что устраняет необходимость второго параметра.

Я бы предпочел второй пример с петлей for. Для меня это выглядит чище (хотя его все еще можно улучшить, как указали другие). Хотя это также означает, что он зависит от этого нуль-терминатора, и если его нет, у вас есть проблемы.

+0

Хорошо, что я знаю, что в этом случае он заканчивается на нуль. Я должен помнить, что это будет во всех других случаях, в которых я могу использовать его. – Plastefuchs

+0

Вы должны придерживаться одного из способов поддержания длины списка. Нулевое завершение в порядке, но затем выбросьте 'filenumber'. Иначе, везде, где вы измените список, у вас будет две вещи, о которых стоит беспокоиться. – ugoren

1

Если ваш массив NULL-terminated, я считаю, что правильный (и эстетический) способ заключается в использовании этого, поэтому я выбрал второй способ.

Кстати, вы, вероятно, имели в виду *file != NULL вместо *file != '\0' (потому что *file - указатель). Вы можете написать только *file.

+1

Это полезно только для обфускации, но '* file! = '\ 0'' также является правильным способом записи условия. '' \ 0'' - это всего лишь ограниченная «0», которая является константой нулевого указателя в контекстах указателя. –

+0

@ DanielFischer Нет, это неверно, потому что NULL может не обязательно оценивать целочисленный литерал 0. [Проверить часто задаваемые вопросы по C.] (Http://c-faq.com/null/index.html) – Lundin

+0

Дополнительные знания с каждым момент! =) – Plastefuchs

1

Это зависит от того, как определяется размер массива.
Лучше всего придерживаться одного способа сделать это, а не смешивать два. Поэтому, если ваша функция получает параметр filenumber, он должен ее использовать.
Это нормально, чтобы определить конец списка по нулевому значению, но тогда вам не нужен параметр размера.

Так что я рекомендую вариацию первого метода, который кажется мне яснее:

for (int i=0; i<filenumber; i++) { 
    printf("%s\n", files[i]); 
} 
1

Если вы хотите, чтобы пропустить первый элемент всегда, и знаю, что это не NULL, а остаток NULL прекращается , Я бы сделал это вот так:

for (files++; *files != NULL; files++) 
{ 
    printf("%s\n", *files); 
} 
Смежные вопросы