Как в этом примере использования указателей работает конструкция *++argv[0] во внутреннем цикле?
#include
int main(int argc, char *argv[])
{
int c, except = 0, number = 0;
while(--argc > 0 && (*++argv)[0] == '-')
{
printf("argv = %s
", *argv);
while(c = *++argv[0])
switch(c){
case 'x':
except = 1;
break;
case 'n':
number = 1;
break;
default:
printf("Illegal option: %c
", c);
argc = 0;
break;
}
}
printf("[DEBUG]: argc = %d
", argc);
if(argc != 1)
printf("Usage: -x -n
");
else
printf("x = %d, n = %d
", except, number);
return 0;
}
Разберу похожую конструкцию (*++argv)[0] во внешнем цикле. Здесь берется нулевой символ строки, которая содержит один из аргументов. Скобки [] имеют более высокий приоритет, чем инкремент и ссылка, поэтому *++argv заключается в скобки. Нулевой элемент массива argv это указатель на имя программы, поэтому инкрементом переходим к следующий строке. После этого разыменовываем указатель и получаем строку. Применение скобок [0] дает нулевой символ этой строки.
Конструкция *++argv[0] мне совсем непонятна. Здесь должен быть проход по строке-аргументу. Это нужно для того, чтобы поддерживались не только ключи типа -x -n, но и ключи вида -nx. Для чего здесь [0]? Как работает выражение целиком?
Ответ
Ну а здесь просто проход посимвольно - как вы написали сами, квадратные скобки имеют более высокий приоритет, так что просто увеличивается указатель argv[0], который изначально указывает на начало строки аргументов, а разыменование дает очередной символ...
Т.е. если вызывается программа так, что argv[1] == -abcxn, то после первой строки (++argv)[0] указатель argv[0] указывает на строку -abcxn. Первое разыменование (в первом while) дает '-', затем, во втором while, просто перебираются все символы строки - a, b, c, x, n
Комментариев нет:
Отправить комментарий