C++ 数字与字符串转换实战:从基础方法到最佳实践
在 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++数据类型处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









