2016-11-10 5 views
1

Я запускаю свою программу с некоторыми аргументами командной строки. Но когда я вхожу 10, 10, 10 и распечатать их, он печатает 49, 49, 49. Вот мой код:Печать целых чисел из аргументов командной строки в C

int main(int argc, char *argv[]) { 
    int seed = *argv[0]; 
    int arraySize = *argv[1]; 
    int maxSize = *argv[2]; 

Почему это происходит ??

ответ

1

Ну, argv - массив указателей на строки. Все аргументы командной строки передаются как строки, а указатель на каждый из них удерживается argv[n], где последовательность для аргумента равна n+1.

Для принимающей среды, ссылаясь на C11, глава §5.1.2.2.1

Если значение argc больше нуля, то строка, на которую указывает argv[0] представляет имя программы; argv[0][0] должен быть нулевым символом, если имя программы недоступно в среде хоста. Если значение argc равно больше одного, то строки программы, указанные на argv[1], равны argv[argc-1] , представляют собой параметры программы.

Таким образом, ясно, что для исполнения как

./123 10 10 10 // 123 двоичное имя

  • argv[0] это не первый «аргумент командной строки передан в программу ». Это argv[1].
  • *argv[1] не возвращает значение int, которое вы передали в качестве аргумента командной строки.

    В принципе, *argv[1] дает значение первого элемента этой строки (т.е. char значение '1'), наиболее вероятно в ASCII кодируются значения (которые вы платформа использует), ANSD согласно ascii table'1' имеет десятичное значение va; lue 49, которое вы видите.

Решение: Вы должны

  • Проверка на количество аргументов (argc)
  • Петля по каждому аргументу строки argv[1] ~ argv[n-1] в то время как argc == n
  • Преобразовать каждый из входных строки в int (для этого случая вы можете использовать strtol())
1

Разыменование строки (*argv[x]) дает вам char (значение первого символа в строке), в этом случае значение ASCII '1': десятичное 49

Вы можете конвертировать эти строки (без разыменования) используя strtol

int arraySize = (int)strtol(argv[1], NULL, 10); 

Во всяком случае argv[0] это имя вашей программы, вы уверены, что имя программы начинается с 1?