Member 13404013 Ответов: 2

Как хранить входные данные командной строки argv в массиве (C)


Попытка ввести входные данные командной строки argv в массив.
Все, что он печатает, - это ячейка памяти, а не входы argv

Что я уже пробовал:

#define MAX 12

int main(int argc, char* argv[])
{
  char* argv_inputs[MAX];
  int array_of_ints[MAX];
  int i, size = argc;

  for(i = 2; i <= argc; i++)
  {
    argv_inputs[i] = argv[i];
    printf("%d ", argv_inputs[i]);
  }

2 Ответов

Рейтинг:
2

Jochen Arndt

Вам не нужна копия argv входной массив, но приходится преобразовывать текстовые аргументы в числа с помощью Atoi-ссылка на C++ [^] или strtol-ссылка на C++ [^] :

int main(int argc, char* argv[])
{
    int array_of_ints[MAX];
    int i;
    
    for (i = 1; i < argc && i < MAX; i++)
    {
        array_of_ints[i] = atoi(argv[i]);
        printf("%d ", array_of_ints[i]);
    }
    return 0;
}
Обратите внимание, что вышеизложенное не проверяет, является ли вход допустимым числом и что я исправил цикл. В C/C++ массивы начинаются с нулевого индекса, и поэтому доступ к последнему элементу осуществляется size - 1.
[РЕДАКТИРОВАТЬ]
Я также добавил проверку, чтобы убедиться, что никаких выходов из привязки не происходит.
[/РЕДАКТИРОВАТЬ]


CPallini

5. пропуск элемента массива 0 для того, чтобы имитировать VB? :-)

Jochen Arndt

Спасибо.

Пропуск argv[0] в качестве пути программы. Я думал о хранении, начиная с нулевого индекса, но он использовал один и тот же индекс для обоих, и поэтому я решил сделать то же самое.

Рейтинг:
12

OriginalGriff

Входные данные представляют собой массив значений указателя на символ, и вы присваиваете их массиву целых чисел. Это не сработает: хотя указатели представляют собой целочисленные значения (или длинные целочисленные значения в 64 - битном приложении), сами числа бессмысленны-это адреса первого символа в каждой строке, поэтому при их печати вы получаете числа, которые вообще не имеют смысла.
Попробовать это:

int main(int argc, char* argv[])
    {
    int i;
    for(i = 2; i < argc; i++)
        {
        printf("%s\n", argv[i]);
        }
    }
Это будет печатать входные данные.


CPallini

Эй, парень, ты выходишь за рамки дозволенного. :-)

OriginalGriff

Да, там не должно быть"=". Я его уберу...