- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我试图从正在解析的命令行中找出哪个函数最适合将十进制、十六进制或八进制数转换为 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
测试 ERANGE
,atoi()
十进制,关于 errno
多线程问题的讨论。< br/> @Marian速度问题。
@Kevin 库的包容性。
要转换short
、signed char
等,考虑strto_subrange()
.
关于c - atoi vs atol vs strtol vs strtoul vs sscanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22865622/
根据this document , The second argument (char **endptr) seems to be a waste of space! If it is set to
我正在尝试使用 strtoul 函数,但如下所示,它返回一个意外的值(在开头添加 ff): #include #include #include main() { unsigned lo
所以我在小端和大端机器上都使用 strtoul 将字符串转换为无符号长整型。小端机器返回正确的值,而大端机器没有。这个函数真的不兼容大端机器吗?如果是这样,是否有变通办法? 代码: printf ("
例如: int main() { errno = 0; printf("val = %lu err: %d\n", strtoul("12345678901234", NULL, 10
您好,我写了一个小测试程序来检查我编写的函数如何将字符串(十六进制数)转换为无符号整数,我发现代码的行为因我使用的编译器或系统而异。 我编译了下面的代码: (1) ideone C++4.3.2 ht
我正在尝试创建一个快速的 iOS 程序,将数字转换为十进制、二进制和十六进制数字。我遇到过 strtoul 函数,但不太明白如何使用它,有人能解释一下吗?谢谢! 最佳答案 strtoul 方法使用起来
根据 strtoul 的文档,关于它的返回值... This function returns the converted integral number as a long int value. I
我有这个愚蠢的示例程序,它将输入值作为十六进制并将其转换为无符号长整数。转换后我将结果打印出来。 #include int main (int argc, char *argv[]) { u
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我需要将大字符数转换为长字符数,以便在 AtmelStudio 上对我的 Atmega8 芯片进行编程。 我尝试使用 atol() 和 strtoul() 但它不起作用。我在谷歌上看到 strtoul
我正在尝试将此代码转换为 unicode int fromHex(const supportlib::string_t &s) { return std::strtoul(s.c_str(),
我在 c 中遇到了 strtol 的一些异常结果 这是示例程序。 #include #include #include int main() { printf("%x\n", st
考虑以下示例: #include #include #include #include int main() { std::setlocale(LC_ALL, "en_US.utf8"
我在 gcc 下编译了以下代码: int parseMsg(const char *msg_to_parse, unsigned long *exp_input, unsigned long *sys
我正在将一个字符串从十六进制转换为十进制。问题是在 Visual Studio 编译器中,转换返回了错误的值。但是,当我使用 g++ 编译器在终端的 Mac 中编译相同的代码时,该值会正确返回。 为什
我正在尝试从 strtoul 函数将十六进制转换为无符号整数。但我得到的输出为 ffffffff。我使用了 stdlib.h 库。谁能告诉我哪里错了? void main() { char st
我正在使用以下代码将 Const char * 转换为 Unsigned long int,但输出始终为 0。我哪里做错了?请告诉我。 这是我的代码: #include #include #inc
我正在寻找将字符串转换为 stdint.h 的标准函数整数,比如 int i = atoi("123"); unsigned long ul = strtoul("123", NULL, 10); u
我试图从正在解析的命令行中找出哪个函数最适合将十进制、十六进制或八进制数转换为 int 最好——在不知道输入的情况下事先。 目标是使用一个函数来识别不同类型的输入并将其分配给它的整数 (int) 值,
我不明白,为什么这不起作用?PS:我从一些谷歌找到了这段代码! 问题:我不知道为什么它会起作用?这也考虑时区吗?! 1 #include 2 #include 3 #include
我是一名优秀的程序员,十分优秀!