Прочтите о strtol(3). Вы можете использовать его как
bool isnumber(const char*s) {
char* e = NULL;
(void) strtol(s, &e, 0);
return e != NULL && *e == (char)0;
}
но это не очень эффективно (например, для строки с миллионом цифр), поскольку будет выполнено бесполезное преобразование.
Но на самом деле вас часто волнует значение этого числа, поэтому вы должны вызывать strtol
при обработке аргументов вашей программы (из аргумента argv
в main
) и заботиться о результате strtol
, который является фактическим значением числа.
Вы используете тот факт, что strtol
может обновлять (с помощью своего третьего аргумента) указатель на конец числа в анализируемой строке. Если этот конечный указатель не становится концом строки, преобразование каким-то образом не удалось.
E.g.
int main (int argc, char**argv) {
long num = 0;
char* endp = NULL;
if (argc < 2)
{ fprintf(stderr, "missing program argument\n");
exit (EXIT_FAILURE); };
num = strtol (argv[1], endp);
if (endp == NULL || *endp != (char)0)
{ fprintf(stderr, "program argument %s is bad number\n", argv[1]);
exit (EXIT_FAILURE); };
if (num<0 || num>=128)
{ fprintf(stderr, "number %ld is out of bounds.\n", num);
exit(EXIT_FAILURE); };
do_something_with_number (num);
exit (EXIT_SUCCESS);
}
person
Basile Starynkevitch
schedule
06.10.2013
argv[1]
превращается вint
? - person P0W   schedule 06.10.2013argv[1]
— этоchar*
, аisNumber
хочетint
(и имя у него очень неудачное: каждоеint param
является числом!) - person Basile Starynkevitch   schedule 06.10.2013