阅读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);
}
我编辑了这篇文章。 –
是什么让你认为'argv [1]'被转换为'int'? – P0W
你的代码不会编译没有错误。由于'argv [1]'是一个char *',但'isNumber'想要一个'int'(并且命名非常糟糕:每个int参数*都是一个数字!) –