Страницы

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

четверг, 2 января 2020 г.

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

#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.

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

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