C标准库 | 字符串转整数/浮点数函数汇总

在日常Linux C语言开发中,不可避免会用到字符串转整数或者浮点数的操作,例如带参数的main函数中,在shell下对着某个命令输入一组数字参数,这组数字实际上是字符串,在程序内部需要将其转换成数字!

一、头文件

#include <stdlib.h>

文件所在路径:

$ ls /usr/include/stdlib.h

二、函数声明

  • 通用函数:
/* Convert a string to a floating-point number.  */
extern double atof (const char *__nptr)
     __THROW __attribute_pure__ __nonnull ((1)) __wur;

/* Convert a string to an integer.  */
extern int atoi (const char *__nptr)
     __THROW __attribute_pure__ __nonnull ((1)) __wur;

/* Convert a string to a long integer.  */
extern long int atol (const char *__nptr)
     __THROW __attribute_pure__ __nonnull ((1)) __wur;

/* Convert a string to a floating-point number.  */
extern double strtod (const char *__restrict __nptr,
                      char **__restrict __endptr)
     __THROW __nonnull ((1));

/* Convert a string to a long integer.  */
extern long int strtol (const char *__restrict __nptr,
                        char **__restrict __endptr, int __base)
     __THROW __nonnull ((1));

/* Convert a string to an unsigned long integer.  */
extern unsigned long int strtoul (const char *__restrict __nptr,
                                  char **__restrict __endptr, int __base)
     __THROW __nonnull ((1));
  • 兼容C99:
#ifdef __USE_ISOC99
/* Convert a string to a long long integer.  */
__extension__ extern long long int atoll (const char *__nptr)
     __THROW __attribute_pure__ __nonnull ((1)) __wur;
#endif

#ifdef  __USE_ISOC99
/* Likewise for `float' and `long double' sizes of floating-point numbers.  */
extern float strtof (const char *__restrict __nptr,
                     char **__restrict __endptr) __THROW __nonnull ((1));

extern long double strtold (const char *__restrict __nptr,
                            char **__restrict __endptr)
     __THROW __nonnull ((1));
#endif

#ifdef __USE_ISOC99
/* Convert a string to a quadword integer.  */
__extension__
extern long long int strtoll (const char *__restrict __nptr,
                              char **__restrict __endptr, int __base)
     __THROW __nonnull ((1));

/* Convert a string to an unsigned quadword integer.  */
__extension__
extern unsigned long long int strtoull (const char *__restrict __nptr,
                                        char **__restrict __endptr, int __base)
     __THROW __nonnull ((1));
#endif /* ISO C99 or use MISC.  */

三、函数作用

  • __nptr:要转换的字符串。
  • __endptr:指向转换中最后一个字符后的字符的指针,很少使用,一般传(char **) NULL
  • __base:基数,进制转换,即传入281016。(当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,遇到 '0' 前置字符则会使用 8 进制转换)
  • 通用函数:
函数参数返回值作用
atof__nptrdouble把参数 __nptr 所指向的字符串转换为一个浮点数(类型为 double 型)
atoi__nptrint把参数 __nptr 所指向的字符串转换为一个整数(类型为 int 型)
atol__nptrlong int把参数 __nptr 所指向的字符串转换为一个整数(类型为 long int 型)
strtod__nptr, __endptrdouble把参数 __nptr 所指向的字符串转换为一个浮点数(类型为 double 型)。
strtol__nptr, __endptr, __baselong int把参数 __nptr 所指向的字符串转换为一个整数(类型为 long int 型)
strtoul__nptr, __endptr, __baseunsigned long int把参数 __nptr 所指向的字符串转换为一个整数(类型为 unsigned long int 型)
  • 兼容C99:
函数参数返回值作用
atoll__nptrlong long int把参数 __nptr 所指向的字符串转换为一个整数(类型为 long long int 型)
strtof__nptr, __endptrfloat把参数 __nptr 所指向的字符串转换为一个浮点数(类型为 float 型)。
strtold__nptr, __endptrlong double把参数 __nptr 所指向的字符串转换为一个浮点数(类型为 long double 型)。
strtoll__nptr, __endptr, __baselong long int把参数 __nptr 所指向的字符串转换为一个整数(类型为 long long int 型)
strtoull__nptr, __endptr, __baselong long int把参数 __nptr 所指向的字符串转换为一个整数(类型为 unsigned long long int 型)

四、使用

  • 源代码:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
        printf("atof: %f\n", atof(argv[1]));
        printf("atoi: %d\n", atoi(argv[1]));
        printf("atol: %ld\n", atol(argv[1]));
        printf("strtod: %f\n", strtod(argv[1], (char **)NULL));
        printf("strtol: %ld\n", strtol(argv[1], (char **)NULL, 0));
        printf("strtoul: %lu\n", strtoul(argv[1], (char **)NULL, 0));

        printf("atoll: %lld\n", atoll(argv[1]));
        printf("strtof: %f\n", strtof(argv[1], (char **)NULL));
        printf("strtold: %Lf\n", strtold(argv[1], (char **)NULL));
        printf("strtoll: %lld\n", strtoll(argv[1], (char **)NULL, 0));
        printf("strtoull: %llu\n", strtoull(argv[1], (char **)NULL, 0));

        return 0;
}
  • 分别输入16进制与10进制验证:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值