将字符串转换为数字 atoi() atof() (危险不要使用它们)

警告:函数 atoiatolatollatof 本质上是不安全的,因为: 如果无法表示结果的值,则行为未定义。 (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()