2012-02-06 3 views
3

Итак, я работаю над утилитой командной строки на базе Linux, которая должна принимать несколько флагов, и я заметил некоторое интересное поведение. Я буду отправлять тестовый код, который я использовал вне основной утилиты. Я использовал этот код, поэтому мне не пришлось изменять фактическую полезность, пока у меня не появился рабочий код, который я мог бы просто вставить. Так вот код, который я возился с:Интересные наблюдения argc, argv и его использование

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) { 
    while(--argc && (*++argv)[0] == '-') 
     putchar('*'); 

    printf("\n%s\n", argv[0]); 
} 

Просьба игнорировать тот факт, что вся эта программа делает это печатать звездочку и распечатать свое имя при вызове с одним аргументом -b. Печать asterik была просто для того, чтобы показать, что цикл работал один раз. Итак, я бегу в терминале как «./test -n», и я ожидал, что выход будет:.

*/тест

К моему удивлению, выход был:

* -b

У меня есть рабочая теория того, что делает заявление (*++argv)[0] делает, но я все еще немного туманно на нем. Мое предположение состоит в том, что он проходит через массив указателей, смотрящих на первый символ в каждой строке, на которую указывает, (*++argv)[0] теперь разыменовывает *argv[0] или нулевой элемент первой строки аргумента.

Таким образом, в основном у меня есть три вопроса:

  1. Что именно это заявление делает?
  2. Почему я не могу вернуться к argv [0] или argv [0] [0], независимо от того, что я пробую?
  3. Сохраняет значение по адресу, указанному argv [0] в другом символе char *, это единственный способ, которым я смог получить доступ к этому значению в этот момент, нормальный путь вокруг этого?

В настоящий момент я действительно смущен этим и пробовал все, что я могу придумать, чтобы это исправить. В какой-то момент у меня была петля, которая печатала бы алфавит, я не знаю, в какую часть памяти обращалась программа. Наиболее интересная перестановка заключалась в том, что где-то тянули переменные sshid.

Благодарим вас за помощь в этом.

ответ

6

++argv изменения argv, чтобы указать на следующий аргумент.

Try что-то вроде

int i = 0; 
while(--argc && argv[++i][0] == '-') 

который поддерживает отдельный индекс, а не перезаписывать argv.

Или

char** argp = argv; 
while(--argc && (*++argp)[0] == '-') 

, который работает так же, как и оригинал, за исключением того, что изменяет копию argv вместо оригинала.

+0

Итак, мои рекомендации были правильными. Это обычная вещь? Я не сталкивался с этим раньше. – Brandon

+3

Это просто семантика приращения указателя массива в * C *. Он не имеет ничего общего с передачей аргументов программы. –

+0

Я бы сказал, что это довольно распространенное использование.Не совсем повсеместно, как и для (i = 0; i

Смежные вопросы