阅读有关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);
}