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