Страницы

Поиск по вопросам

пятница, 11 января 2019 г.

Конструкция *++argv[0] в языке Си

Как в этом примере использования указателей работает конструкция *++argv[0] во внутреннем цикле?
#include #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

Комментариев нет:

Отправить комментарий