引言
atof() 函数是 C 标准库中用于将字符串(ASCII 字符串)转换为双精度浮点数(double 类型) 的函数,其名称来源于 “ASCII to Float” 的缩写,主要用于处理包含小数或科学计数法的字符串。
一、基本信息
函数原型
#include <stdlib.h> // 必须包含的头文件
double atof(const char *str);
/*
参数 str:指向待转换的字符串的指针(字符串需符合浮点数格式,如 "3.14"、"-123.45"、"1e3" 等)。
返回值:转换后的 double 类型浮点数;若转换失败(如字符串无有效浮点数),则返回 0.0。
*/
核心功能
将符合浮点数格式的字符串转换为对应的 double 数值,支持:
- 整数部分(如 "123")、小数部分(如 "123.45");
- 正负号(如 "-123.45"、"+67.89");
- 科学计数法(如 "1e3" 表示 1×10³,"2.5e-2" 表示 2.5×10⁻²);
- 忽略字符串开头的空白字符(空格、制表符 \t、换行符 \n 等)。
二、转换示例
输入字符串 | 转换结果(double) | 说明 |
---|---|---|
"3.14" | 3.14 | 基本小数格式 |
"-123.45" | -123.45 | 带负号的小数 |
" +67.89abc" | 67.89 | 忽略开头空白和正号,遇到 'a' 停止 |
"123" | 123.0 | 整数自动转换为浮点数 |
"1e3" | 1000.0 | 科学计数法(1×10³) |
"2.5e-2" | 0.025 | 带小数的科学计数法(2.5×10⁻²) |
"abc1.23" | 0.0 | 非数字开头,转换失败 |
""(空字符串) | 0.0 | 无有效字符,转换失败 |
三、代码示例
#include <stdio.h>
#include <stdlib.h> // 包含 atof() 的头文件int main()
{char str1[] = "3.14159"; // 基本小数char str2[] = "-123.456"; // 带负号的小数char str3[] = " +78.9e2"; // 带空白、正号和科学计数法char str4[] = "abc0.123"; // 非数字开头char str5[] = "123.45abc"; // 数字后带非数字字符printf("atof(\"%s\") = %.5f\n", str1, atof(str1)); // 3.14159printf("atof(\"%s\") = %.3f\n", str2, atof(str2)); // -123.456printf("atof(\"%s\") = %.1f\n", str3, atof(str3)); // 7890.0(78.9×10²)printf("atof(\"%s\") = %.3f\n", str4, atof(str4)); // 0.000(转换失败)printf("atof(\"%s\") = %.2f\n", str5, atof(str5)); // 123.45(遇到 'a' 停止)return 0;
}
四、与 strtod() 的对比
atof() 是 strtod() 的简化版本,两者的核心差异如下:
特性 | atof(const char *str) | strtod(const char *str, char **endptr) |
---|---|---|
错误处理 | 无(失败返回 0.0,无法区分有效 0.0) | 可通过 endptr 判断转换终止位置 |
数值范围 | 支持 double,溢出未定义 | 支持 double,溢出返回 HUGE_VAL 等 |
格式支持 | 仅十进制浮点数(含科学计数法) | 支持十进制、十六进制浮点数(如 "0x1.2p3") |