【问题标题】:checking for strtol unsuccessful conversions [duplicate]检查 strtol 不成功的转换[重复]
【发布时间】:2014-08-10 21:16:52
【问题描述】:

基本上使用 strtol 来检查不成功的转换, 我正在使用该功能

width = (int)  strtol(argv[2], NULL, 10);
if (errno != 0) {
    printf("Please parse integer argument");
}

使用errno.h

当参数是字符时有效,即:argv[2] = e, 6, etic 但是,当提供 444r 或 33f(前导数字后跟字符)等参数时,这无法捕获错误?有什么我遗漏的吗?

【问题讨论】:

  • 阅读文档! (提示:第二个参数是什么,你传递NULL 是为了什么?)
  • 此外,如果您在检查之前强制转换为 int,您将无法捕获诸如(例如,对于具有 32 位 int 和 64 位 long 的平台)输入 4294967296 之类的错误。
  • 另外,您应该在调用 strtol() 之前清除 errno。 strtol()函数成功后不会改变errno的设置。
  • 这也有很好的信息:stackoverflow.com/a/3792676/103167
  • @Dipstick:这句话出自哪里? strtol 可能会在成功时更改 errno

标签: c parsing


【解决方案1】:

您可以使用strtol() 的第二个参数来接收指向数字后第一个字符的指针,并检查该字符是否为NUL(即'\0')。

【讨论】:

【解决方案2】:

您应该使用函数的第二个参数来确定解析停止的位置。根据C标准

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

至于 errno 那么

如果正确值超出可表示值的范围, LONG_MIN、LONG_MAX、LLONG_MIN、LLONG_MAX、ULONG_MAX 或 ULLONG_MAX 是 返回(根据返回类型和值的符号,如果有), 宏ERANGE的值存储在errno中。

请务必注意,如果未进行任何转换,则 endptr 将包含 nptr 的值。

【讨论】:

  • 所以,errno 对确定输入错误没有用处。
猜你喜欢
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2012-07-02
  • 1970-01-01
  • 2017-05-10
  • 2021-10-01
相关资源
最近更新 更多