C++ 字符串、字符数组与数值类型转换实战指南

小满
小满
发布时间:2026-10-16 | 7人浏览过
原创

在 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); 
以上就是 C++ 中字符串、字符数组与数值类型相互转换的详细内容,更多关于 C++ 类型处理机制的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表