将字符串转换为数字 atoi() atof() (危险不要使用它们)
警告:函数 atoi
,atol
,atoll
和 atof
本质上是不安全的,因为: 如果无法表示结果的值,则行为未定义。 (7.20.1p1)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{
int val;
if (argc < 2)
{
printf("Usage: %s <integer>\n", argv[0]);
return 0;
}
val = atoi(argv[1]);
printf("String value = %s, Int value = %d\n", argv[1], val);
return 0;
}
当要转换的字符串是范围内的有效十进制整数时,该函数有效:
$ ./atoi 100
String value = 100, Int value = 100
$ ./atoi 200
String value = 200, Int value = 200
对于以数字开头的字符串,后跟其他内容,只解析初始数字:
$ ./atoi 0x200
0
$ ./atoi 0123x300
123
在所有其他情况下,行为未定义:
$ ./atoi hello
Formatting the hard disk...
由于上面的含糊不清和这种未定义的行为,永远不应该使用 atoi
系列函数。
- 要转换为
long int
,请使用strtol()
而不是atol()
。 - 要转换为
double
,请使用strtod()
而不是atof()
。
Version >= C99
- 要转换为
long long int
,请使用strtoll()
而不是atoll()
。