Хотя вы можете полагаться на циклическое повторение символов, проверяя, является ли каждый isdigit()
, если ваша цель - использовать числовое значение, которое представляет аргумент, вы также можете использовать strtol/strtoul
для преобразования значения в значение signed/unsigned
и полагаться на надежные отчеты об ошибках, чтобы точно сказать, что произошло во время преобразования и какая часть аргумента, если таковая имеется, состояла из нецифровых чисел.
Семейство функций strtoX
принимаетуказатель на строку цифр и адрес для endptr
в качестве параметров (а также базу для целочисленных преобразований).Функция пытается преобразовать цифры в число, обновляя endptr
, чтобы указывать на первый символ после последней успешно преобразованной цифры.Это позволяет вам определить, был ли ваш аргумент составлен из начальных цифр, соответствуют ли они в пределах диапазона для типа попытки преобразования, и существуют ли какие-либо дополнительные символы после последней преобразованной цифры.
Краткий пример объясняет:
#include <stdio.h>
#include <stdlib.h> /* for strtol */
#include <errno.h> /* errno - for strtol validation */
int main (int argc, char **argv) {
char *endptr; /* end pointer for strtol */
long l;
if (argc < 2) { /* validate at least one argument provided */
fprintf (stderr, "error: insufficient arguments provided.\n"
"usage: %s number\n", argv[0]);
return 1;
}
errno = 0; /* zero errno before call */
l = strtol (argv[1], &endptr, 0); /* attempt converstion to long */
if (endptr == argv[1]) { /* check if digits were converted */
fprintf (stderr, "error: no digits converted in '%s'.\n", endptr);
return 1;
}
else if (errno) { /* check for error in conversion */
perror ("strtol-argv[1]");
return 1;
}
printf ("number provided: %ld\n", l); /* output number */
if (*endptr) /* endptr not pointing to `'\0'`, chars remain */
printf ("\nadditional characters following number: '%s'.\n", endptr);
return 0;
}
Пример использования / Вывод
$ ./bin/strtolarg 123456
number provided: 123456
$ ./bin/strtolarg -123456
number provided: -123456
$ ./bin/strtolarg "val=123456"
error: no digits converted in 'val=123456'.
$ ./bin/strtolarg "123456=val"
number provided: 123456
additional characters following number: '=val'.
Посмотрите вещи и дайте мне знать, если у вас есть вопросы.