对于uint32_t和其他stdint类型,atoi或strtoul的等价物是什么?

Chr*_*eur 6 c c99 type-conversion stdint

我正在寻找将字符串转换为stdint.h整数的标准函数

int i = atoi("123");
unsigned long ul = strtoul("123", NULL, 10);
uint32_t n = mysteryfunction("123"); // <-- ???
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 8

有两个常规选项:strto[iu]max然后检查值是否适合较小的类型,或切换到sscanf.C标准定义了一整套宏,<inttypes.h>其中扩展为<stdint.h>类型的适当转换说明符.示例uint32_t:

#include <inttypes.h>
#include <stdio.h>

int main()
{
    uint32_t n;

    sscanf("123", "%"SCNu32, &n);
    printf("%"PRIu32"\n", n);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(在的情况下uint32_t,strtoul+溢检查也将工作uint32_t,因为unsigned long是宽至少32位.这将不能可靠地对工作uint_least32_t,uint_fast32_t,uint64_t等等)

编辑:正如Jens Gustedt在下面所说,这并没有提供完全的灵活性,strtoul因为你无法指定基础.但是,基座8和基座16仍然可以分别用SCNo32和获得SCNx32.

  • @larsmans:缺少的最大的东西不是异国情调的基础,它是'strtouxxx`允许你指定一个'0`的基数,在这种情况下,它是从数字推断出来的(通过将其解释为整数常量),如果你想允许(比方说)有人同时使用十六进制和十进制,这可能非常有用.当然,结束指针有时也非常有用. (2认同)