C++ 字符串、字符数组与数值类型转换实战指南
在 C++ 开发中,不同数据结构之间的数据流转是基础且高频的需求。本文针对 std::string、char [](字符数组)与整型、浮点型数值之间的转换进行系统梳理。文章通过剖析标准函数与常用内置函数的原理与用法,结合具体代码示例,帮助用户快速掌握从文本解析到格式化输出的各类转换手段。
一、std::string 与 char 数组的互换
由于 std::string 是管理内存的对象,而 char [] 本质上是原始字节序列,两者直接的隐式转换往往受到限制或性能开销较大。我们需要根据方向采取不同的策略。
第1步:将 std::string 转换为 char 数组
目的:获取底层字符数据的只读指针或进行物理拷贝以适配旧接口。
操作方法:
- 只读访问:使用
s.c_str()或s.data()。这将返回一个指向字符串内容的const char*指针,适用于需要常量字符指针的场景(如传递给printf或 C 风格 API)。 - 物理拷贝:若需修改内容,必须分配目标
char []并执行拷贝。推荐使用strcpy(头文件<cstring>)。
#include <string.h>
#include <iostream>
using namespace std;
int main() {
string s = "123.123";
char a[101];
// 将 string 的内容复制到字符数组 a 中
strcpy(a, s.c_str());
cout << a << endl;
// 验证独立性:后续改变 s 不会影响已复制的 a
s = "456.456";
cout << a << endl; // 依然输出 123.123
return 0;
}
第2步:将 char 数组转换为 std::string
目的:利用 std::string 的特性(自动内存管理、字符串拼接)来处理原始字符数据。
操作方法:直接赋值即可,编译器会自动调用 std::string 的构造函数。
#include <iostream>
#include <string>
using namespace std;
int main() {
char a[100] = "123.123";
string s = a; // 构造新对象
cout << s;
return 0;
}
二、字符数组 (char []) 与数值互转
这是数据处理中最常见的问题,核心在于如何安全地将人眼可读的十进制串解析为二进制数值,或反之。
第1步:char 数组转整型和浮点型
准备条件:引入 <stdlib.h> 或 <cstdlib> 头文件。
操作步骤:
- 使用
atoi()将字符串转为int。 - 使用
atof()将字符串转为double。 - 对于更大范围的数据,使用
atol()(long) 和atoll()(long long)。
这些函数会跳过前导空白符,直到遇到非数字字符为止。
#include <stdlib.h>
#include <iostream>
using namespace std;
int main() {
char a_chars[101] = "123.123";
int a_int = atoi(a_chars); // 截取整数部分,结果为 123
double a_double = atof(a_chars); // 解析小数,结果为 123.123
cout << a_int << endl;
cout << a_double << endl;
// 进阶示例:处理含前导零或负号的情况
char b_chars[101] = "-013.470";
double b_double = atof(b_chars); // 结果 -13.47
return 0;
}
第2步:数值转 char 数组(格式化字符串)
目的:将计算得到的数值格式化为特定的字符表示。
操作方法:使用 sprintf(stdio 库),其行为类似 printf,但将输出写入指定缓冲区。
#include <stdio.h>
using namespace std;
int main() {
char a[1001];
// 将浮点数保留 10 位小数格式化至字符串 a
sprintf(a, "%.10lf", 3.1415926535);
printf("%s\n", a); // 输出: 3.1415926535
return 0;
}
注意:C++11 提供了更现代的 std::to_string() 函数(位于 <string> 头文件),可将任意数值转化为 std::string,再配合 .c_str() 可间接得到 char*,但这会产生临时对象且精度不可控,高性能场景建议优先使用 sprintf 或流操作。
第3步:数值转 char 数组(特定进制与非标准转换)
在某些嵌入式或竞赛环境中,可能会用到 itoa / ltoa 系列函数。它们允许指定进制基数。
#include <stdlib.h>
#include <iostream>
using namespace std;
int main() {
int val = 12;
char s[16] = {0};
itoa(val, s, 2); // 转二进制,结果 "1100"
cout << s << endl;
itoa(val, s, 8); // 转八进制,结果 "14"
cout << s << endl;
itoa(val, s, 16); // 转十六进制,结果 "c"
cout << s << endl;
return 0;
}
风险提示:itoa、ltoa 并非 ISO C/C++ 标准的一部分,它们在大多数 Windows (MSVC) 环境下可用,但在 Linux GCC/G++ 环境或某些严格的竞赛 OJ 平台上可能因缺少对应函数定义而导致编译错误。生产代码中建议使用 sprintf(s, "%d", val) 或 std::stringstream 来替代此类非标函数。
三、补充说明与排错
在使用 printf 输出 std::string 时,切勿直接传入 string 变量,这会导致未定义行为或显示乱码。必须显式调用 .c_str() 强制转换:
// 正确做法
string str = "Hello";
printf("%s", str.c_str());
// 错误做法 (编译可能通过但运行出错)
// printf("%s", str);
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









