首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现不带errno的strtol()更好吗?

实现不带errno的strtol()更好吗?
EN

Stack Overflow用户
提问于 2018-12-09 13:30:11
回答 1查看 409关注 0票数 2

传统strtol()通常是这样使用的:

代码语言:javascript
运行
复制
int main()
{
    errno = 0;
    char *s = "12345678912345678900";
    char *endptr;
    long i = strtol(s,  &endptr, 10);
    if(i == LONG_MAX && errno == ERANGE) 
        printf("overflow");
}

我们需要访问errno两次,现在的errno通常是一个C宏,最后扩展为一个函数。考虑到将字符串解析为整数并不是一项繁重的工作,这看起来有点昂贵。

那么,在没有errno的情况下实现strtol,但是使用一些其他方法来指示溢出,是不是更好呢?

像这样:

代码语言:javascript
运行
复制
long strtol(const char *nptr, char **endptr, int base, bool *is_overflow);

而不是

代码语言:javascript
运行
复制
long strtol(const char *nptr, char **endptr, int base);
EN

回答 1

Stack Overflow用户

发布于 2018-12-09 14:14:16

是不是更好的实现不带错误的strtol ...

不是的。

...但是使用一些其他方法来指示溢出呢?

不是的。

代码语言:javascript
运行
复制
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);

strtol()是一个标准的C库函数,任何实现都必须遵循3个输入和errno的正确使用才能兼容。

当然,OP可以根据需要实现其他一些my_strtol()

任何关于避免errno的性能问题都是一个微优化,但也是一个合理的设计目标。

这实际上归结为如何将字符串的问题传递给long

允许垃圾数据溢出"12345678912345678901234567890"

  • No转换"abc"

  • Excess "123 abc"

  • Leading
  • ,允许尾部空格?
  • Allow

一旦定义了关于所有异常情况的功能,而不仅仅是溢出,那么关于errno的编码问题就会很有用,即使不太可能做出任何有意义的性能改进。

errno相比,只对一个基础进行编码可能是提高速度的一条更有效的途径。

操作码不是健壮的strtol()用法。建议:

代码语言:javascript
运行
复制
char *s = "12345678912345678900";

char *endptr;
errno = 0;
long i = strtol(s,  &endptr, 10);
if (errno == ERANGE) printf("Overflow %ld\n", i);
else if (s == endptr) printf("No conversion %ld\n", i);
else if (*endptr) printf("Extra Junk %ld\n", i);
else printf("Success %ld\n", i);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53689670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档