传统strtol()通常是这样使用的:
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,但是使用一些其他方法来指示溢出,是不是更好呢?
像这样:
long strtol(const char *nptr, char **endptr, int base, bool *is_overflow);而不是
long strtol(const char *nptr, char **endptr, int base);发布于 2018-12-09 14:14:16
是不是更好的实现不带错误的strtol ...
不是的。
...但是使用一些其他方法来指示溢出呢?
不是的。
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);strtol()是一个标准的C库函数,任何实现都必须遵循3个输入和errno的正确使用才能兼容。
当然,OP可以根据需要实现其他一些my_strtol()。
任何关于避免errno的性能问题都是一个微优化,但也是一个合理的设计目标。
这实际上归结为如何将字符串的问题传递给long
允许垃圾数据溢出"12345678912345678901234567890"
"abc"
"123 abc"
一旦定义了关于所有异常情况的功能,而不仅仅是溢出,那么关于errno的编码问题就会很有用,即使不太可能做出任何有意义的性能改进。
与errno相比,只对一个基础进行编码可能是提高速度的一条更有效的途径。
操作码不是健壮的strtol()用法。建议:
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);https://stackoverflow.com/questions/53689670
复制相似问题