2013-10-06 106 views
1

我是C新手,我正在考虑如何自己写这个函数。我从命令行获取参数,因此它存储在argv数组中,我想确定它是否是数字。什么是最简单的方法来做到这一点?如何编写自己的isnumber()函数?

谢谢

#include <stdio.h> 

int isNumber(int *param) 
{ 
    if (*param > 0 && *param < 128) 
     return 1; 
    return 0; 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc == 2) 
     isNumber(argv[1]); 
    else printf("Not enought parameters."); 

    return 0; 
} 
+0

我编辑了这篇文章。 –

+1

是什么让你认为'argv [1]'被转换为'int'? – P0W

+0

你的代码不会编译没有错误。由于'argv [1]'是一个char *',但'isNumber'想要一个'int'(并且命名非常糟糕:每个int参数*都是一个数字!) –

回答

3

阅读strtol(3)。你可以使用它作为

bool isnumber(const char*s) { 
    char* e = NULL; 
    (void) strtol(s, &e, 0); 
    return e != NULL && *e == (char)0; 
} 

,但不是非常有效(例如对于数字一百万的字符串),因为无用的转换将会作出修改。

但事实上,你经常关心那个数的值,所以你会在你的程序参数处理来电strtolargv参数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); 
} 
+0

+1这只会检查整个_“number”_ – P0W

+0

我知道函数strtol。我其实想要没有它。 –

+0

然后使用'strtol'并检查它的结果是<128'(也许'> = 0')并检查结束指针。 BTW,127可以被一些奇怪的用户写成'00000177'(八进制)或'0x000000000000000000000000000000000000000000000000000000000007F'(十六进制)。 –

0

如何尝试这样的:

#include <ctype.h> 

if(isdigit(input)) 
{ 
    return true; 
} 
else 
{ 
    return false; 
} 

OR更简单H2CO3评论:

#define isnumber isdigit 

OR

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
int main() { 

    //some code 
    theChar = atoi(string[i]); 
    if (isdigit(theChar)) { 
    return true; 
    } 
    return 0; 
} 
+2

这更简单地写成'#define isnumber isdigit' – 2013-10-06 08:06:28

+0

@ H2CO3: - 是的,这是真的。我只是想这样写。这是错的吗? :( –

+0

这没有错,只是多余的,恕我直言,它没有多大帮助,因为OP有一个字符串,而不是一个字符(不是他不应该能够自己弄清楚,但无论如何。) – 2013-10-06 08:08:34

0

如何

#define MYISNUM(x) ((x) >= '0' && (x) <= '9') 
+3

更好地使用'isdigit'从'' –

0

我不知道,如果你想检查它是否是一个数字或一个数字和argv[1]类型为char *不是整数,所以你应该做这样的事情:

bool isDigit(char *param) 
{ 
    return (*param >= `0` && *param <= `9`) 
} 

bool isNumber(char *param) 
{ 
    while (param) 
    { 
     if (!isDigit(param)) 
      return false; 
     param++; 
    } 
    return true; 
} 
相关问题