gpt4 book ai didi

c - atoi vs atol vs strtol vs strtoul vs sscanf

转载 作者:太空狗 更新时间:2023-10-29 16:33:19 31 4
gpt4 key购买 nike

我试图从正在解析的命令行中找出哪个函数最适合将十进制、十六进制或八进制数转换为 int 最好——在不知道输入的情况下事先。

目标是使用一个函数来识别不同类型的输入并将其分配给它的整数 (int) 值,然后可以这样使用:

./a.out 23 0xC4 070

可以打印

23
196 /*hexadecimal*/
56 /*octal*/

我能看到的唯一问题是解析以找出十进制整数和八进制整数之间的差异。

题外话,这个把字符串转成整数使用稳定吗?

最佳答案

which function would be best to convert either a decimal, hexadecimal, or octal number to an int the best (?)

要将此类文本转换为 int,建议使用 long strtol(const char *nptr, char **endptr, int base); 转换为 时进行额外测试>int,如果需要的话。

使用 0 作为 base 评估转向转换中的早期字符作为 base 10、16 或 8。
@Mike Holt

Convert text per:
Step 1: Optional whitespaces like `' '`, tab, `'\n'`, ... .
Step 2: Optional sign: `'-'` or `'+'`.
Step 3:
0x or 0X followed by hex digits--> hexadecimal
0 --> octal
else --> decimal

示例代码

#include <errno.h>
#include <limits.h>
#include <stdlib.h>

int mystrtoi(const char *str) {
char *endptr;
errno = 0;
// v--- determine conversion base
long long_var = strtol(str, &endptr, 0);
// out of range , extra junk at end, no conversion at all
if (errno == ERANGE || *endptr != '\0' || str == endptr) {
Handle_Error();
}

// Needed when `int` and `long` have different ranges
#if LONG_MIN < INT_MIN || LONG_MAX > INT_MAX
if (long_var < INT_MIN || long_var > INT_MAX) {
errno = ERANGE;
Handle_Error();
}
#endif

return (int) long_var;
}

atoi vs atol vs strtol vs strtoul vs sscanf ... to int

atoi()
亲:很简单。
专业版:转换为 int
Pro: 在 C 标准库中。
优点:快。
缺点:超出范围的错误,未定义的行为@chqrlie
缺点:既不处理十六进制也不处理八进制。

atol()
优点:简单。
Pro: 在 C 标准库中。
优点:快。
缺点:转换为 long,而不是大小可能不同的 int
缺点:超出范围的错误,未定义的行为
缺点:既不处理十六进制也不处理八进制。

strtol()
优点:简单。
Pro: 在 C 标准库中。
优点:良好的错误处理。
优点:快。
优点:可以处理二进制文件。 (基数 2 到基数 36)
缺点:转换为 long,而不是大小可能不同的 int

strtoul()
优点:简单。
Pro: 在 C 标准库中。
优点:良好的错误处理。
优点:快。
优点:可以处理二进制文件。
---:不提示负数。
缺点:转换为 unsigned long,而不是大小可能不同的 int

sscanf(..., "%i", ...)
Pro: 在 C 标准库中。
专业版:转换为 int
---:中间道路的复杂性。
缺点:可能很慢。
缺点:OK 错误处理(未定义溢出)。

locale 设置会影响/受益。 §7.22.1.4 6 “在“C”语言环境以外的其他语言环境中,可以接受其他特定于语言环境的主题序列形式。”


额外学分:
@Jonathan Leffler : errno 测试 ERANGEatoi() 十进制,关于 errno 多线程问题的讨论。< br/> @Marian速度问题。
@Kevin 库的包容性。


要转换shortsigned char等,考虑strto_subrange() .

关于c - atoi vs atol vs strtol vs strtoul vs sscanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22865622/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com