C++ 数字与字符串转换实战:从基础方法到最佳实践

不晚
不晚
发布时间:2026-10-13| 4人浏览过
原创

在 C++ 开发中,数据类型的转换是基础且高频的操作,特别是数字与字符串之间的互转。本文将从原生指针/引用转换、C 风格函数(sprintf/sscanf)以及标准库流对象(stringstream)三个维度,详细解析各类转换场景的实现方式及其注意事项。

1. 字符串类型之间的基础转换

C++ 中常见的字符串类型包括 std::string、char* 以及 MFC/ATL 中的 CString。它们之间的转换主要依赖内置构造函数和成员函数。

第1步:string 与 char* 的互转

目的:实现现代 C++ 标准字符串与 C 风格字符数组的无缝切换。
操作:

  • string 转 char*:使用 .c_str() 或 .data() 获取指向底层缓冲区的只读指针。
  • char* 转 string:直接通过 std::string 的构造函数进行初始化。
// (1) string --> char *
std::string str("OK");
// 注意:返回的 const char* 仅用于读取,不可修改底层内容
const char * p = str.c_str();

// (2) char* --> string
const char *p = "OK";
std::string str(p); 

第2步:涉及 CString 的转换

背景:CString 是 Windows 平台下常用的字符串类,管理内部缓冲区。若需获取可写的 char* 指针,必须调用 .GetBuffer(),并在修改完成后调用 .ReleaseBuffer() 以释放锁定状态,防止缓冲区扩展受限。

具体操作说明

  • CString 转 char*:
CString m_Str("OK");
// 获取可写指针
char * p = m_Str.GetBuffer(0);
// ... 执行写入操作 ...
m_Str.ReleaseBuffer(); // 必须释放
  • char* 转 CString:
char *p = "OK";
CString m_Str(p);
// 或者使用格式化
CString m_Str;
m_Str.Format("%s", p); 
  • string 与 CString 互转:通常通过中间层 char* 或 .Format 完成。
// string --> CString
CString s;
s.Format("%s", std_string_var.c_str());

// CString --> string
std::string s(CString_var.GetBuffer(0)); 
// GetBuffer()后一定要ReleaseBuffer(),否则可能影响动态增长

2. 数值与字符串的互转:经典 C 风格函数

当需要在格式化数字输出或解析字符串时,sprintf 和 sscanf 是最直接的解决方案,但需注意缓冲区溢出风险。

第1步:使用 sprintf 将数字转为字符串

入口:包含头文件 <cstdio>。
参数:目标缓冲区、格式控制符、源数值。
示例:

char str[64]; // 建议分配足够大的缓冲区

// 整数转十进制字符串
int a = 1234321;
sprintf(str, "%d", a);

// 浮点数保留指定位数小数
double b = 123.321;
sprintf(str, "%.3lf", b); // 保留3位小数

// 十进制转十六进制
int c = 255;
sprintf(str, "%x", c); // 小写 hex
sprintf(str, "%X", c); // 大写 Hex

注意:虽然存在平台相关的 itoa() 函数可用于整数转字符串,但因其非标准性,推荐统一使用标准的 sprintf 以保证跨平台兼容。

第2步:使用 sscanf / atoi 系列将字符串转为数字

入口:包含头文件 <cstdio> 或 <cstdlib>。
区别:sscanf 支持复杂格式解析,而 atoi/atol/atof 仅处理简单的单值转换。

使用 sscanf

char str[] = "12345";
int val;
sscanf(str, "%d", &val);

char floatStr[] = "3.14159";
double dVal;
sscanf(floatStr, "%lf", &dVal);

char hexStr[] = "FF";
sscanf(hexStr, "%x", &val); // 解析为十进制的 255

使用 atox 系列函数

更简洁的方式是直接利用库函数:atoi()(转 int)、atol()(转 long)、atof()(转 double)。例如:double val = atof("123.45");

3. 现代化标准做法:使用 stringstream 流

相较于 C 风格的函数,C++ 标准库提供的 <sstream> 组件更安全、类型安全且支持链式操作,是现代 C++ 推荐的首选方案。

第1步:ostringstream 用于写(数字转字符串)

原理:将任意基本类型插入到输出流中,最后提取完整字符串。
代码示例:

#include 
#include 
#include 

using namespace std;

ostringstream oss;
oss << "Result: " << 22 << '
';
string result = oss.str();
cout << result; 

第2步:istringstream 用于读(字符串转数字)

原理:将字符串赋值给输入流,通过流提取操作符 >> 解析出对应的数值类型。
代码示例:

istringstream iss;
iss.str("25");
int num;
iss >> num;
cout << num; // 输出 25

优势**:自动处理类型边界检查,无需像 sprintf 那样担心格式化符号与变量类型不匹配的严重错误。

总结

在实际开发中,优先推荐使用 std::to_string() (C++11起) 和 std::stoi/ stod 等新版 API,它们比 stringstream 更高效且简洁。对于复杂的日志拼接,使用 ostringstream;对于老旧的代码维护或特定的 C 接口对接,再考虑 sprintf 或类型转换函数。

以上就是C++数字与字符串转换常用方法的详细内容,更多关于C++数据类型处理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。