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

C中的命令行参数整数错误检查,c,parsing,error-handling,integer,C,Parsing,Error Handling,Integer,我正在尝试从C的命令行上给定的参数成功解析一个整数。给定的输入如下所示: a、 出局2 很简单。但是,我不知道如何对此进行错误检查。例如,以下每次运行都应引发错误: a、 out 2hi a、 出去,你好 a、 输出4x 在我使用sscanf时,我实现的错误处理捕获整数本身前面的任何非整数字符(例如“>a.out hi4”)。Atoi()和strtol()不起作用,因为它们只解析参数前面的整数值。任何帮助都将不胜感激 int是整数(char*str) int is_integer(char *s

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

a、 出局2

很简单。但是,我不知道如何对此进行错误检查。例如,以下每次运行都应引发错误:

a、 out 2hi

a、 出去,你好

a、 输出4x

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

int是整数(char*str)
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;
}
{ 如果(!str) 返回0; int len=0,pmflag=0; while(*str!='\0')//如果确定为空终止 { 如果(*str=='-'| |*str=='+')) { 如果(len) 返回0; pmflag=1; } else if(*str<'0'|*str>'9') { 返回0; } len++; str++; } if(pmflag&&len==1) 返回0; 返回1; }
使用
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…
另见:


只要在你的论点上循环一下,如果遇到非数字的话就大声吼叫。你还能要求什么?顺便说一句:
scanf()
允许数字前有空格。