sách gpt4 ai đã đi

atoi so với atol so với strtol so với strtoul so với sscanf

In lại Tác giả: Space Dog 更新时间:2023-10-29 16:33:19 34 4
mua khóa gpt4 Nike

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

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

./a.out 23 0xC4 070

可以打印

hai mươi ba
196 /*hexadecimal*/
56 /*octal*/

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

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

1 Câu trả lời

which function would be best to convert either a decimal, hexadecimal, or octal number to an số nguyên the best (?)

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

sử dụng 0 BẰNG 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 
#include
#include

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();
}
#kết thúc nếu

return (int) long_var;
}

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

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

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

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

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

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

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


额外学分:
@Jonathan Leffler : errno Bài kiểm tra ERANGE,atoi() 十进制,关于 errno 多线程问题的讨论。< br/> @Marian速度问题。
@Kevin 库的包容性。


要转换ngắn,signed char等,考虑strto_subrange() .

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

34 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com