C++ 使用填充字符居中字符串

💡 原文英文,约400词,阅读约需2分钟。
📝

内容提要

在C++编程中,我们经常希望打印一个居中且带有一些字符填充的字符串,以使输出看起来漂亮。本文介绍了如何在C++中使用std::format函数(C++20)和std::string函数(C++14)来居中字符串。通过示例代码展示了如何使用填充字符将字符串居中并填充到指定宽度。可以使用G++编译代码,并使用C++14或C++20运行。如果编译器不支持格式化头文件,可以使用GCC Docker Hub中的Docker容器。

🔎

延伸解读

两种实现路径的版本选择

文章给出了C++14和C++20两种居中字符串的实现方式。C++20的std::format通过格式化字符串直接指定填充字符和对齐方式,代码更简洁;C++14则需手动计算左右填充字符数并拼接。读者应根据项目支持的C++标准选择,若编译器支持C++20且包含format头文件,优先使用std::format;否则采用手动拼接方案。

宽度不足时的异常处理

示例代码中,当目标宽度小于字符串长度时,会抛出std::runtime_error异常。这提醒开发者,在实际使用中应确保传入的宽度足够容纳字符串,或添加异常处理逻辑,避免程序意外终止。文章未讨论其他边界情况,如空字符串或填充字符为多字节字符,读者需自行考虑。

编译器兼容性与Docker方案

文章指出,即使编译器支持C++20,也可能缺少format头文件。为此,作者建议使用GCC Docker Hub中的gcc:13.2.0容器,该容器同时支持C++20和format头文件。这为在受限环境中体验新特性提供了便捷途径,但需注意Docker环境的配置和镜像拉取。

❓

Q&A

C++中如何将字符串居中并用指定字符填充到固定宽度?

可以使用C++20的std::format或C++14的std::string方法。std::format方法通过构造格式字符串如"{:*^40}"并调用std::vformat实现;std::string方法则手动计算左右填充字符数,用std::string(left_pad, pad) + s + std::string(right_pad, pad)拼接。

C++14中如何手动实现字符串居中填充?

在C++14中,可以编写函数:先检查宽度是否小于字符串长度,若小于则抛出异常;然后计算左右填充数:left_pad = (width - len) / 2,right_pad = width - len - left_pad;最后返回std::string(left_pad, pad) + s + std::string(right_pad, pad)。

使用std::format居中字符串时,格式字符串怎么写?

格式字符串为"{:" + 填充字符 + "^" + 宽度 + "}",例如填充'*'、宽度40时,格式字符串为"{:*^40}"。然后使用std::vformat和std::make_format_args生成居中字符串。

如果编译器不支持<format>头文件,如何运行C++20的居中字符串代码?

可以使用GCC Docker Hub中的Docker容器,例如gcc:13.2.0,该容器支持C++20和<format>头文件。通过docker pull gcc:13.2.0拉取镜像,然后在容器内编译运行。

居中字符串时,如果指定的宽度小于字符串长度会怎样?

在示例代码中,如果宽度小于字符串长度,会抛出std::runtime_error异常,提示"Width is too small."。

如何用G++编译并运行居中字符串的示例代码?

使用命令g++ centered_string.cpp -o centered_string -std=c++14(或-std=c++20)编译,然后运行./centered_string。输出显示字符串被居中并用指定字符填充到40个字符宽度。

🏷️

标签

➡️

继续阅读