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



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

errno 保证

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

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

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

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

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

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

根据man strtol

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

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

您可以检查是否存在errno,如 CppReference 上的示例所示。

最新更新