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

Posted Neutionwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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进制验证:

以上是关于C标准库 | 字符串转整数/浮点数函数汇总的主要内容,如果未能解决你的问题,请参考以下文章

[C/C++笔面试]不使用库函数将整数转换为字符串

浮点数在c中的基数排序

FORTRAN里怎样把数值类型(整数,浮点数)转换为字符串

基数排序浮点数

C/C++如何对浮点数取余?(如果需要的话)

如何判断C语言的一个浮点数是否整数?