命令行参数C中的整数错误检查

时间:2014-04-14 02:25:01

标签: c parsing error-handling integer

我正在尝试从C命令行上给出的参数中成功解析一个整数。给定的输入将如下所示:

  

a.out 2

很简单。但是我无法弄清楚如何对此进行错误检查。例如,以下每个运行都应该抛出错误:

  

a.out 2hi

     

a.out 9hello

     

a.out 4x

我实现的错误处理捕获整数本身前面的任何非整数字符(例如“> a.out hi4”),因为我正在使用sscanf。 Atoi()和strtol()不起作用,因为它们只是解析参数前面的整数值。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

int is_integer(char *str)
{   
    if(!str)
        return 0;
    int len = 0, pmflag = 0;
    while(*str != '\0') // if you sure about null-termination
    {
        if(*str == '-' || *str == '+')
        {
            if(len)
                return 0;
            pmflag = 1;
        }
        else if(*str < '0' || *str > '9')
        {
            return 0;
        }
        len++;
        str++;
    }
    if(pmflag && len == 1)
        return 0;
    return 1;
}

答案 1 :(得分:0)

使用strtol()并检查它转换的结尾是字符串的结尾:

char *end;

errno = 0;
long l = strtol(argv[1], &end, 10);  // 0 if you want octal/hex/decimal

if (end == argv[i] || *end != '\0' || ((l == LONG_MIN || l == LONG_MAX) && errno == ERANGE))
    …report problems…
…either use l as a long, or check that it is in the range INT_MIN..INT_MAX

这将悄悄地跳过领先的空白。如果这是一个问题,你也可以检查它们:

if (!isdigit((unsigned char)argv[i]) && argv[i] != '+' && argv[i] != '-')
   …first character isn't part of a decimal number…

另见: