Проверка диапазона с аргументами командной строки - PullRequest
1 голос
/ 09 марта 2010

Работая над простой программой на C, я застрял в тесте if:

int line_number = 0;
if ((line_number >= argv[2]) && (line_number <= argv[4]))

gcc говорит:

cp.c:25: warning: comparison between pointer and integer
cp.c:25: warning: comparison between pointer and integer

Что я могу сделать, чтобы правильно проверить диапазон линий, с которыми я хочу иметь дело?

Ответы [ 2 ]

8 голосов
/ 09 марта 2010

Конечно, это не работает: argv - это указатель на указатель на char .. Не ясно, что вы хотите сделать, но подумайте о том, что argv[2] - это третий параметр, а argv[4] - пятый , Но они имеют тип char* (они являются строками), поэтому, если вы хотите проанализировать их как целые числа, вы должны сделать это с помощью функции atoi:

int value = atoi(argv[2]);

проанализирует int, который был третьим параметром, и поместит его в переменную, затем вы можете проверить все, что захотите.

2 голосов
/ 09 марта 2010

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

В то время как ответ Джека верен, заявив, что строки argv должны быть сначала преобразованы в числа, использование atoi для этой цели (особенно в ситуации, когда ввод поступает из «внешнего мира») является преступлением против программирования на Си. Практически нет ситуаций, когда atoi может быть осмысленно использовано в программе.

Функция, которую вы должны использовать в этом случае: strtol

char *end;
long long_value = strtol(argv[2], &end, 10);
if (*end != '\0' || errno == ERANGE)
  /* Conversion error happened */;

Точное условие проверки ошибок (например, требуется ли *end == '\0') будет зависеть от ваших намерений.

Если вы хотите получить int в конце, вам также следует проверить значение для диапазона int (или для вашего конкретного диапазона применения)

if (long_value < INT_MIN || long_value > INT_MAX)
  /* Out of bounds error */;

int value = long_value;
/* This is your final value */
...