Читайте о 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
может обновить (через свой третий аргумент) указатель на конец номера в разобранной строке. Если этот конечный указатель не станет концом строки, преобразование каким-то образом не удалось.
Э.Г.
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);
}
Я редактировал сообщение. –
Что заставляет вас думать 'argv [1]' преобразуется в 'int'? – P0W
Ваш код не будет компилироваться без ошибок. Поскольку 'argv [1]' является 'char *', но 'isNumber' хочет' int' (и очень плохо назван: каждый 'int param' * является * числом!) –