【问题标题】:How to write own isnumber() function?如何编写自己的 isnumber() 函数?
【发布时间】:2013-10-06 16:27:37
【问题描述】:

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

谢谢

#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;
}

【问题讨论】:

  • 是什么让您认为argv[1] 被转换为int
  • 你的代码编译不会出错。因为argv[1] 是一个char*,但isNumber 想要一个int(而且命名非常糟糕:每个int param 一个数字!)

标签: c numbers argv


【解决方案1】:

了解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 可以更新(通过其第三个参数)指向已解析字符串中数字末尾的指针这一事实。如果该结束指针没有成为字符串的结尾,则转换会以某种方式失败。

例如

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);
 } 

【讨论】:

  • 我知道函数 strtol。我真的想没有它。最大数量将是 127。
  • 然后使用strtol 并检查它的结果是&lt;128(也许是&gt;=0)并检查结束指针。顺便说一句,127 可能被一些奇怪的用户写成00000177(八进制)或0x000000000000000000000000000000000000000000000000000000000007F(十六进制)。
【解决方案2】:

怎么样

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

【讨论】:

  • &lt;ctype.h&gt;更好地使用isdigit
【解决方案3】:

这样试试怎么样:

#include <ctype.h>

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

OR 更简单,如 H2CO3 评论:

 #define isnumber isdigit

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

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

【讨论】:

  • 这更简单地写成#define isnumber isdigit
  • @H2CO3:- 是的,没错。我只是想这样写。这是错的吗? :(
  • 这没有错,只是多余的,恕我直言,它没有多大帮助,因为 OP 有一个字符串,而不是一个字符(不像他不应该自己弄清楚,但无论如何.)
  • @H2CO3:- 明白了!按照建议用更简单的版本更新了我的答案。谢谢
  • 是的,看到了,太好了。
【解决方案4】:

我不确定您是否要检查它是数字还是数字,而 argv[1] 的类型为 char * 而不是 int,所以您应该这样做:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多