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