如何解析整数但使用strtol将“0”保留为有效值?

时间:2014-01-15 01:09:18

标签: c

这可能看起来非常明显,但strtol提供了对已解析整数的响应 - 但失败时它为0。如果我解析的整数是0怎么办?

3 个答案:

答案 0 :(得分:4)

errno仅保证在上溢/下溢(到ERANGE)的情况下设置。对于其他错误,您必须检查endptr的值。引用C89:

long int strtol(const char *nptr, char **endptr, int base);
  

如果主题序列为空或没有预期   形式,不进行转换; nptr的值存储在   endptr指向的对象,前提是endptr不是null   指针。

通常,endptr设置为指向转换后的最后一个字符后输入字符串中的下一个字符,因此如果它等于字符串的开头,则可以确定没有执行任何转换。例如,

char *nptr = "not a number", *endptr;
long n = strtol(nptr, &endptr, 10);
assert(nptr != endptr); //false

POSIX包含一个方便的扩展名,在这种情况下也会将errno设置为EINVAL,但这是非标准的。

答案 1 :(得分:1)

根据man strtol

  

如果无法执行转换,则返回0并将全局变量errno设置为        EINVAL(最后一个功能不能在所有平台上移植)。

您平台上的情况不是这样吗?如果是这样,你在哪个平台?

答案 2 :(得分:0)

您可以在CppReference上的示例here中检查是否存在errno