cout 默认不支持 printf 风格的格式化,别硬套 %d;从 C 转来的开发者易误用,应改用流操作符或 std::format(C++20)。
cout 默认不支持 printf 风格的格式化,别硬套 %d
很多人从 C 转过来,第一反应是写
,不是替换。C++ 的
是流式设计,格式控制靠操纵符(manipulators)或
(C++20 起),不是占位符。
用
、
、
切换进制,它们是“粘性”的,设一次影响后续所有整数输出
浮点数精度由
控制,默认按有效位数(不是小数位),要固定小数位得搭配
宽度控制(
)只对**下一个输出项**生效,不“粘”,常被误以为能全局对齐
用 iomanip 操纵符做基础格式控制(C++98 起就可用)
头文件
提供了最常用的格式化工具,适合简单场景,比如打印表格、对齐数字。
:设置下一项最小宽度,不足补空格(左对齐),需配合
或
改对齐方式
:和
配合,把空格换成指定字符,如
+
:输出固定小数位,例如
变成
注意:这些操纵符本质是插入特殊函数对象到流中,不能用
赋值,也不能跨
保留——每项都要重设
示例:
C++20 起优先用 std::format,更接近 printf 直观性
如果编译器支持 C++20(如 GCC 13+、Clang 15+、MSVC 19.30+),
是更安全、更易读的选择,它返回字符串,不依赖流状态,也避免
的“只生效一次”陷阱。
C知道
CSDN推出的一款AI技术问答工具
下载
立即学习
“
C++免费学习笔记(深入)
”;
语法类似 Python f-string:
格式说明符里可直接写对齐、填充、宽度,如
表示 8 位零填充十六进制
不修改全局流状态,线程安全,也不会因忘记重置
导致后续输出错乱
缺点:目前部分标准库实现(尤其 libstd
c++
)对
支持还不完整,编译时可能报
,此时得回退到
容易被忽略的细节:流状态是持久的,且不同数据类型行为不同
一个
对象内部维护着格式标志(
),比如是否启用
、是否开启
。一旦设置,就一直生效,直到被显式清除或覆盖。
整数输出受
/
/
影响;浮点数不受它们影响,但受
/
控制
没有“恢复默认”的快捷方式,必须手动重置,例如用
或保存原始标志再恢复
会让
输出为
而非
,但它也持久——后面所有
都会变文字,除非关掉
多线程环境下共享
时,某个线程改了格式标志,可能意外影响其他线程输出,这是隐式耦合,极难调试
所以,要么用
隔离格式逻辑,要么在关键输出前后显式设置/恢复标志,别指望“它自己会复位”。
cout —— 这会原样输出 %dcoutstd::formatstd::hexstd::decstd::octstd::setprecisionstd::fixedstd::setwstd::setw(n)std::leftstd::rightstd::setfill(c)std::setwstd::setfill('0')std::setprecision(n)std::fixedstd::fixed 让 3.141593.14=<<cout 输出 000042 | 3.14std::formatstd::setwstd::format("x = {:d}, pi ≈ {:.3f}", x, 3.14159){:08x}std::hexstd::formaterror: 'format' is not a member of 'std'iomanipcoutfmtflagsstd::hexstd::scientificstd::hexstd::decstd::octstd::fixedstd::scientificcout.setf(ios_base::dec, ios_base::basefield)std::boolalphatrue"true"1boolstd::coutstd::format