【问题标题】:How to convert the number 0 with strtol? [duplicate]如何用strtol转换数字0? [复制]
【发布时间】:2019-05-29 06:44:42
【问题描述】:

我需要 strtol 来转换 [0 到 255] 范围内的一些数字 如果 0 也是我需要转换的数字,如何检查 0 的转换?

long conv = strtol(argv, &p, 10);
if (conv == 0)
{
    perror("Conversion error");
    exit(EXIT_FAILURE);
}
if ((conv >= LONG_MAX || conv <= LONG_MIN) && errno == 34);
{
    perror("Invalid Range!");
    exit(EXIT_FAILURE);
}

【问题讨论】:

  • 天哪,该函数确实使用零作为信号值。那是谁的主意?
  • 检查 p 是否与 argv 不同
  • 其实我认为零是不能解析字符串的默认返回值。
  • 未知,@Ôrel cmets 正确。在strtol(argv, &amp;p, 10)if (argv == p) perror("Conversion error");之后

标签: c


【解决方案1】:

在调用strtol之前,将errno设置为0。

然后在调用之后,检查errno 的值。如果为 0,则说明调用成功。另外,您需要检查*p 是否为 0。如果是,则表示整个字符串已成功解析,没有多余的字符。

errno = 0;
long conv = strtol(argv, &p, 10);  
if (errno)
{
    perror("Conversion error");
    exit(EXIT_FAILURE);
}
else if (*p)
{
    perror("Not all characters converted");
    exit(EXIT_FAILURE);
}

man page 在“备注”部分也提到了这一点:

因为 strtol() 可以合法地返回 0、LONG_MAX 或 LONG_MIN (LLONG_MAX 或 LLONG_MIN for strtoll()) 成功和失败, 呼唤 程序应该在调用之前将errno设置为0,然后通过检查errno是否有非零来判断是否发生错误 后的值 打电话。

【讨论】:

  • 我不确定在未完成转换时是否需要设置errno。手册页说:“实现可能还将 errno 设置为 EINVAL,以防没有执行转换(没有看到数字,返回 0)。”并且该标准仅在上溢/下溢的情况下将 ERANGE 提及为 errno。此示例未设置 errno ideone.com/T3ddyH 。我认为您需要比较 argvp 才能发现没有转化的情况
  • C 标准对转换失败时的errno 没有要求(只有范围问题)。 Linux 手册页在这一点上与 C 规范不一致。代码应检查if (argv == p) 是否存在无转换条件。
  • @chux 我发布的代码应该考虑所有错误情况,无论errno is set to EINVAL. It both checks errno` 并检查p 是否指向要测试的字符串的末尾进行完整的转换。
  • 如果 errno 不是由 strtol() 在非转换(符合 C 标准)上设置的,则此代码不会错误地抱怨 strtol("", &amp;p, 10);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 1970-01-01
  • 2013-09-03
  • 2013-03-28
  • 1970-01-01
  • 2014-02-22
相关资源
最近更新 更多