最直接的方法是使用std::to_string,它类型安全且使用方便;若需格式控制,则推荐std::stringstream;而sprintf虽灵活但有缓冲区溢出风险,应谨慎使用。

在C++里,要把数字变成字符串,最直接、最现代的办法就是用
std::to_string
std::stringstream
sprintf
将数字转换为字符串,C++提供了几种主流方式,每种都有其适用场景和优缺点。我个人在日常开发中,会根据具体需求在它们之间做取舍。
1. std::to_string
这是最现代、最简洁的方式。它的优点在于类型安全、使用方便,并且能自动处理各种标准数字类型(
int
long
long long
float
double
long double
立即学习“C++免费学习笔记(深入)”;
#include <string>
#include <iostream>
int main() {
int num_int = 123;
double num_double = 3.14159;
long long num_ll = 9876543210LL;
std::string s_int = std::to_string(num_int);
std::string s_double = std::to_string(num_double);
std::string s_ll = std::to_string(num_ll);
std::cout << "Int to string: " << s_int << std::endl;
std::cout << "Double to string: " << s_double << std::endl;
std::cout << "Long long to string: " << s_ll << std::endl;
// 值得注意的是,to_string对于浮点数通常会保留较多小数位,
// 如果需要控制精度,它就力不从心了。
float f_val = 1.234567f;
std::string s_float = std::to_string(f_val);
std::cout << "Float to string (default precision): " << s_float << std::endl;
return 0;
}std::to_string
2. std::stringstream
当
std::to_string
std::stringstream
std::cout
std::string
#include <sstream> // 别忘了这个头文件
#include <string>
#include <iostream>
#include <iomanip> // 用于setprecision, setw等
int main() {
double pi = 3.1415926535;
int hex_val = 255;
int padding_val = 42;
// 控制浮点数精度
std::stringstream ss_precision;
ss_precision << std::fixed << std::setprecision(2) << pi; // 固定小数点,保留两位
std::string s_pi = ss_precision.str();
std::cout << "PI (2 decimal places): " << s_pi << std::endl; // 输出 "3.14"
// 转换为十六进制
std::stringstream ss_hex;
ss_hex << std::hex << hex_val;
std::string s_hex = ss_hex.str();
std::cout << "255 in hex: " << s_hex << std::endl; // 输出 "ff"
// 添加前导零和宽度控制
std::stringstream ss_padding;
ss_padding << std::setw(5) << std::setfill('0') << padding_val; // 总宽度5,不足补0
std::string s_padding = ss_padding.str();
std::cout << "42 with leading zeros: " << s_padding << std::endl; // 输出 "00042"
// 多个值组合
std::stringstream ss_combo;
ss_combo << "The value is " << padding_val << " and PI is " << std::fixed << std::setprecision(3) << pi;
std::string s_combo = ss_combo.str();
std::cout << "Combined string: " << s_combo << std::endl;
return 0;
}stringstream
3. sprintf
sprintf
printf
#include <cstdio> // 用于sprintf
#include <string>
#include <iostream>
int main() {
char buffer[50]; // 必须预先分配足够的缓冲区,这是风险所在!
int num = 123;
double val = 3.14159;
// 简单转换
sprintf(buffer, "%d", num);
std::string s_num = buffer;
std::cout << "Int via sprintf: " << s_num << std::endl;
// 控制浮点数精度
sprintf(buffer, "%.2f", val); // 保留两位小数
std::string s_val = buffer;
std::cout << "Double via sprintf (2 decimal places): " << s_val << std::endl;
// 添加前导零和宽度
sprintf(buffer, "%05d", num); // 总宽度5,不足补0
std::string s_padded_num = buffer;
std::cout << "Int via sprintf (padded): " << s_padded_num << std::endl;
// 十六进制
sprintf(buffer, "%x", 255);
std::string s_hex_num = buffer;
std::cout << "Hex via sprintf: " << s_hex_num << std::endl;
// 缓冲区溢出风险示例 (不要在实际代码中这样做!)
// char small_buffer[5];
// sprintf(small_buffer, "This is a very long string: %d", 123456789);
// std::cout << small_buffer << std::endl; // 会导致运行时错误或安全漏洞
return 0;
}虽然
sprintf
itoa
sprintf
说真的,当我在代码审查中看到
itoa
至于
sprintf
int
long long
sprintf
再来,
sprintf
"%d"
"%.2f"
sprintf(buffer, "%d", 3.14);
sprintf(buffer, "%f", 123);
相比之下,
std::to_string
std::stringstream
sprintf
性能这个话题,在C++里总是让人又爱又恨。对于数字转字符串,如果你真的到了需要抠性能的地步,那么选择就得稍微讲究一下了。
通常来说,std::to_string
std::stringstream
std::to_string
stringstream
sprintf
sprintf
sprintf
我个人认为,除非你的性能分析结果明确指出数字转字符串是你的程序瓶颈,否则大可不必过早地去优化它。
std::to_string
std::stringstream
std::format
stringstream
格式化是数字转字符串时一个非常常见的需求,尤其是浮点数精度、整数的宽度和进制。不同的方法有不同的控制手段。
使用 std::stringstream
stringstream
iomanip
小数精度 (std::setprecision
std::fixed
std::scientific
std::setprecision(n)
std::fixed
std::fixed
std::scientific
#include <sstream>
#include <iomanip> // setprecision, fixed
double value = 123.456789;
std::stringstream ss;
ss << std::setprecision(4) << value; // 总共4位有效数字,结果可能是 "123.5"
std::cout << ss.str() << std::endl;
ss.str(""); // 清空流内容
ss.clear(); // 清空状态标志
ss << std::fixed << std::setprecision(2) << value; // 小数点后2位,结果 "123.46"
std::cout << ss.str() << std::endl;
ss.str("");
ss.clear();
ss << std::scientific << std::setprecision(3) << value; // 科学计数法,3位小数,结果 "1.235e+02"
std::cout << ss.str() << std::endl;前导零和宽度 (std::setw
std::setfill
std::setw(n)
std::setfill(char)
#include <sstream>
#include <iomanip> // setw, setfill
int num = 7;
std::stringstream ss;
ss << std::setw(3) << std::setfill('0') << num; // 宽度3,不足补0,结果 "007"
std::cout << ss.str() << std::endl;
ss.str("");
ss.clear();
ss << std::setw(5) << std::setfill('*') << num; // 宽度5,不足补*,结果 "***07" (setfill在setw之后生效)
std::cout << ss.str() << std::endl;进制转换 (std::hex
std::oct
std::dec
std::hex
std::oct
std::dec
#include <sstream>
#include <iomanip> // hex, oct
int num = 255; // 二进制 11111111
std::stringstream ss;
ss << std::hex << num; // 结果 "ff"
std::cout << ss.str() << std::endl;
ss.str("");
ss.clear();
ss << std::oct << num; // 结果 "377"
std::cout << ss.str() << std::endl;
ss.str("");
ss.clear();
ss << std::dec << num; // 结果 "255"
std::cout << ss.str() << std::endl;使用 sprintf
sprintf
%.nf
以上就是c++++如何将数字转换为字符串_c++数字转字符串实现技巧的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号