在日常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
:基数,进制转换,即传入2
、8
、10
、16
。(当 base 的值为 0
时,默认采用 10
进制转换,但如果遇到 '0x'
/ '0X'
前置字符则会使用 16
进制转换,遇到 '0'
前置字符则会使用 8
进制转换)
- 通用函数:
函数 | 参数 | 返回值 | 作用 |
| | | 把参数 |
| | | 把参数 |
| | | 把参数 |
| | | 把参数 |
| | | 把参数 |
| | | 把参数 |
- 兼容C99:
函数 | 参数 | 返回值 | 作用 |
| | | 把参数 |
| | | 把参数 |
| | | 把参数 |
| | | 把参数 |
| | | 把参数 |
四、使用
- 源代码:
#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
进制验证: