使用string和string_view(三)——字符串格式化

发布时间:2026/9/12 11:50:33

使用string和string_view(三)——字符串格式化 目录1. std::format2. 格式说明符2.1 width2.2 [fill]align2.3 sign2.4 \#2.5 type2.6 precision2.7 0参考1. std::format直到C20之前字符串的格式化一般是通过printf()之类的C风格函数或是C的I/O流完成的1. C风格函数不推荐因为它们不是类型安全的并且无法扩展支持自定义类型因为字符串和参数是分开的所以可读性高且容易翻译成不同语言。例如printf(x has value %d and y has value %d.\n, x, y);2. C I/O流推荐(C20之前)因为类型安全且可扩展因为字符串和参数交织在一起所以可读性差且难以翻译成不同语言。例如std::cout x has value x and y has value y std::endl;C20引入了std::format()用来格式化字符串它定义在format中。它基本结合了C风格函数和C的I/O流的所有优点是一种类型安全且可扩展的机制。format()的第一个参数是待格式化的字符串后续参数是用于填充待格式化字符串中占位符的值。到目前为止使用format()时的占位符一般都是一对花括号{}。在这些花括号内可以是格式为[index][:specifier]的字符串。可以省略所有占位符中的index也可以为所有占位符指定从零开始的索引以指明应用于此占位符的第二个和后续参数。如果省略index则format()的第二个和后续参数传递的值将按给定顺序应用于所有占位符。specifier是一种格式化说明符用于更改值在输出中格式化的方式将在下一节详细说明。如果需要输出{or}字符则需要将其转义为{{or}}。以下对format()的调用省略了占位符中的显式索引auto s1 { std::format(Read {} bytes from {}\n, n, file1.txt) };可以按以下方式手动指定索引auto s1 { std::format(Read {0} bytes from {1}\n, n, file1.txt) };不允许混合使用手动和自动索引。下例使用了一个无效的字符串格式化auto s2 { std::format(Read {0} bytes from {}\n, n, file1.txt) };可以更改输出字符串中格式化值的顺序而不需要更改传递到format()的实参的实际顺序。如果要在软件中翻译字符串这是一个有用的功能。某些语言在句子中不同的顺序。例如前面的格式化字符串可以翻译成中文如下所示。在中文中句子中占位符的顺序是颠倒的但是由于格式化字符串中的占位符是有索引的format()函数的参数顺序保持不变(L前缀的用法后面介绍)。auto s3 { std::format(L从{1}中读取{0}个字节\n, n, Lfile1.txt) }:2. 格式说明符格式说明符用于控制值在输出中的格式前缀为冒号。格式说明符的一般形式如下所示(L与地区特定格式有关但是在我国好像没啥变化)。[[fill]align][sign][#][0][width][.precision][L][type]方括号里的所有说明符都是可选的。2.1 widthwidth指定待格式化的值所占字段的最小宽度例如5。width也可以是另一组花括号称为动态宽度。如果在花括号中指定了索引例如{3}则动态宽度的width取自给定索引对应的format()的实参。如果未指定索引例如{}则width取自format()的实参列表中的下一个参数。示例如下inti{42};std::coutstd::format(|{:5}|\n,i);// | 42|std::coutstd::format(|{:{}}|\n,i,8);// | 42|2.2 [fill]align[fill]align说明使用哪个字符作为填充字符然后是值在其字段中的对齐方式。对齐符号含义左对齐(非整数和非浮点数的默认对齐方式)右对齐(整数和浮点数的默认对齐方式)^居中对齐在待格式化字符前插入⌊ 宽度 − 待格式化字符串长度 2 ⌋ \lfloor\frac{宽度-待格式化字符串长度}{2}\rfloor⌊2宽度−待格式化字符串长度​⌋个字符在待格式化字符串之后插入⌈ 宽度 − 待格式化字符串长度 2 ⌉ \lceil\frac{宽度-待格式化字符串长度}{2}\rceil⌈2宽度−待格式化字符串长度​⌉fill字符会被插入输出中以确保输出中的字段达到说明符的[width]指定的最小宽度。如果未指定[width]则[fill]align无效。示例如下inti{42};std::coutstd::format(|{:7}|\n,i);// | 42|std::coutstd::format(|{:7}|\n,i);// |42 |std::coutstd::format(|{:_7}|\n,i);// |_____42|std::coutstd::format(|{:_^7}|\n,i);// |__42___|2.3 signsign符号含义-只显示负数的符号(默认方式)显示正数和负数的符号空格对负数使用负号对于正数使用空格示例如下inti{42};std::coutstd::format(|{:5}|\n,i);// |42 |std::coutstd::format(|{:5}|\n,i);// |42 |std::coutstd::format(|{: 5}|\n,i);// | 42 |std::coutstd::format(|{: 5}|\n,-i);// |-42 |2.4 ##启用所谓的备用格式规则。如果为整型启用并且还指定了十六进制、二进制或八进制数字格式则备用格式会在格式化数字前面插入0x、0X、0b、0B或0。如果为浮点类型启用则备用格式将始终输出十进制分隔符即使后面没有数字。具体示例见下面。2.5 typetype指定了给定值要被格式化的类型类型符号含义整型bBd(整型默认类型)oxX二进制二进制当指定#时使用0B而不是0b十进制八进制小写字母abcde的十六进制大写字母ABCDE的十六进制当指定#时使用0X而不是0x浮点型e,Ef,Fg(浮点型默认类型),Ga,A以小写e或大写E表示指数的科学表示法按照给定精度或6(如果未指定精度)格式化固定表示法按照给定精度或6(如果未指定精度)格式化以小写e或大写E表示指数的通用表示法按照给定精度或6(如果未指定精度)格式化带有小写字母(a)或大写字母(A)的十六进制表示法布尔型s(布尔型默认类型)bBcdoxX以文本形式输出true或false以整型输出1或0字符型c(字符型默认类型)bBdoxX输出字符副本整数表示字符串s(字符串默认类型)输出字符串副本指针p(指针默认类型)0x为前缀的十六进制表示法整型示例如下inti{42};std::coutstd::format(|{:10d}|\n,i);// | 42|std::coutstd::format(|{:10b}|\n,i);// | 101010|std::coutstd::format(|{:#10b}|\n,i);// | 0b101010|std::coutstd::format(|{:10o}|\n,i);// | 52|std::coutstd::format(|{:#10o}|\n,i);// | 052|std::coutstd::format(|{:10x}|\n,i);// | 2a|std::coutstd::format(|{:#10X}|\n,i);// | 0X2A|布尔型示例如下boolt{true};boolf{false};std::coutstd::format(|{:10s}|\n,t);// | true|std::coutstd::format(|{:10b}|\n,f);// | 0|std::coutstd::format(|{:10B}|\n,t);// | 1|std::coutstd::format(|{:10d}|\n,f);// | 0|std::coutstd::format(|{:10o}|\n,t);// | 1|std::coutstd::format(|{:10x}|\n,f);// | 0|std::coutstd::format(|{:10X}|\n,t);// | 1|字符型示例如下chara{c};std::coutstd::format(|{:10c}|\n,a);// |c |std::coutstd::format(|{:#10b}|\n,a);// | 0b1100011|std::coutstd::format(|{:#10B}|\n,a);// | 0B1100011|std::coutstd::format(|{:10d}|\n,a);// | 99|std::coutstd::format(|{:#10o}|\n,a);// | 0143|std::coutstd::format(|{:#10x}|\n,a);// | 0x63|std::coutstd::format(|{:#10X}|\n,a);// | 0X63|字符串的示例如下std::string s{ProCpp};std::coutstd::format(|{:_^10}|\n,s);// |__ProCpp__|2.6 precisionprecision只能用于浮点和字符串类型。它的格式为一个点后跟浮点类型要输出的小数点位数(e、f、a)或整个浮点类型包含的有效数字个数(g)或字符串要输出的字符数。就像width一样也可以是另一组花括号在这种情况下它被称为动态精度。precision取自format()的实参列表中的下一个实参或具有给定索引的实参。浮点型的示例如下doubled{3.1415/2.3};std::string s{Hello, World!};std::coutstd::format(|{:12.2g}|\n,d);// | 1.4|std::coutstd::format(|{:12.3e}|\n,d);// | 1.366e00|std::coutstd::format(|{:12.2a}|\n,d);// | 1.5ep0|intwidth{12};intprecision{3};std::coutstd::format(|{2:{0}.{1}f}|\n,width,precision,d);// | 1.366|2.7 00表示对于数值将0插入格式化结果中以达到[width]指定的最小宽度。这些0插在数值前面但在符号以及任何0x、0X、0b或0B前缀之后。如果指定了align则将忽略本选项。示例如下inti{42};doublef{3.1415/2.3};std::coutstd::format(|{:06d}|\n,i);// |000042|std::coutstd::format(|{:06d}|\n,i);// |00042|std::coutstd::format(|{:06X}|\n,i);// |00002A|std::coutstd::format(|{:#06X}|\n,i);// |0X002A|std::coutstd::format(|{:#06o}|\n,i);// |000052|std::coutstd::format(|{:012.3f}|\n,f);// |00000001.366|参考[比] 马克·格雷戈勒著 程序喵大人 惠惠 墨梵 译 C20高级编程(第五版)
延伸阅读

更多相关文章

2026/9/12 11:50:33

基于3D物流图与改进奇里科夫图的图像混合加密方案

1. 项目概述在数字图像安全传输领域,图像加密技术一直是研究热点。这个项目提出了一种结合3D物流图和改进型奇里科夫图的混合加密方案,通过Matlab实现了一套完整的图像加密解密系统。我在实际测试中发现,这种混合算法在安全性、抗攻击性和执行…

2026/9/12 11:45:33

SqlSugar ORM框架核心特性与高级应用实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 11:45:33

电力系统经济调度中的遗传算法优化实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 12:50:35

GDevelop无代码游戏开发:MIT开源+本地AI如何实现一句话做游戏

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 12:50:35

51单片机直流电机PWM闭环控制Proteus仿真教程

简介:本资源是一套基于51单片机的智能小车仿真学习套件,面向嵌入式初学者、单片机课程设计学生及Proteus仿真入门者,解决直流电机控制逻辑与避障行为模拟的实践难点。压缩包共37个文件,涵盖Proteus仿真工程(.dsn/.dbk&…

2026/9/12 12:50:35

312章103万字跑下来:AI长篇写作真正难的是这三件事

312 章、103 万字、47 条伏笔全程没丢,这篇复盘了 AI长篇写作 真正难的三件事:开书时把规矩立死、中期盯住别记混、后期盯住伏笔别漏收。蛙趣拼文 的一致性检查和伏笔看板把这三件事变成每章两个动作,加起来不到十分钟;据社科院报…

2026/9/12 12:50:35

大数据技术实战:从建模到分析的全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 12:50:35

聚簇索引和非聚簇索引简介

聚簇索引,是对磁盘的数据按照一个或多个列进行重新排序的算法。 磁盘上数据的存储顺序与索引的顺序是一致的。 一般情况下,主键会默认创建聚簇索引。一张表中只能有一个聚簇索引。 所以,在MySQL中,一张表如果存在主键&am…

2026/9/12 12:45:35

dcode 如何在会话中切换模型并持久化模型配置?

dcode 如何在会话中切换模型并持久化模型配置? 【免费下载链接】deepagents The batteries-included agent harness. 项目地址: https://gitcode.com/GitHub_Trending/de/deepagents 在 deepagents 仓库的终端编码产品 deepagents-code(命令名为 …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码