std::string本身不支持对齐,需手动实现左/右/居中对齐函数,核心是计算填充长度并拼接;C++20的std::format仅支持空格填充且不适用非ASCII字符串的显示宽度对齐。

std::string 本身不支持对齐,得靠自己拼接
标准库的 std::string 没有内置的 align() 或类似方法。所谓“字符串对齐”,本质是往原字符串左右补空格(或指定填充字符),凑够总宽度。C++20 引入了 std::format,但它的对齐是格式化输出用的,生成的是新字符串,且不直接暴露填充逻辑;而多数实际场景(比如控制台表格、日志对齐、文件写入)需要的是可复用的字符串处理函数。
手动实现左/右/居中对齐的通用函数
核心逻辑就三步:算原长、算需补空格数、拼接。注意边界情况——如果原字符串长度 ≥ 目标宽度,直接返回原串,不截断。
- 左对齐:
str + std::string(width - str.length(), ' ') - 右对齐:
std::string(width - str.length(), ' ') + str - 居中对齐:左边补
(width - str.length()) / 2个空格,右边补剩余(注意奇数差时右侧少 1 个)
示例函数:
std::string align_string(const std::string& s, size_t width, char fill = ' ', char mode = 'c') {
if (s.length() >= width) return s;
size_t pad = width - s.length();
if (mode == 'l') return s + std::string(pad, fill);
if (mode == 'r') return std::string(pad, fill) + s;
// mode == 'c'
size_t left = pad / 2;
size_t right = pad - left;
return std::string(left, fill) + s + std::string(right, fill);
}用 std::format 实现对齐(C++20 起)
std::format 支持格式说明符,如 {:>10}(右对齐宽 10)、{:^12}(居中宽 12),但它返回 std::string,且仅限于格式化输出场景。它不接受自定义填充字符(默认空格),也不方便嵌入到已有字符串拼接流程中。
立即学习“C++免费学习笔记(深入)”;
- 右对齐:
std::format("{:>8}", "abc")→" abc" - 居中:
std::format("{:^6}", "hi")→" hi " - 错误写法:
std::format("{:0>5}", "x")—— C++20 不支持0填充,只认空格;填其他字符会编译失败
所以,若需填充字符不是空格(比如 '-' 或 '*'),必须手写函数,std::format 无解。
宽字符和 Unicode 字符串对齐要小心
上面所有方案都按 std::string::length() 计数,即字节数。对 UTF-8 编码的中文或 emoji,一个字符占多个字节,但显示宽度未必等于字节数(比如一个中文字符通常占 2 个等宽字符位)。此时 length() 不能反映真实显示宽度。
- 终端显示错位、表格列不齐,往往是因为用了 UTF-8 字符串但按字节对齐
- 没有标准库函数能可靠计算 Unicode 字符的显示宽度(
std::wstring在 Windows 下也未必准) - 简单规避方式:只对 ASCII 字符串做对齐;或引入第三方库(如
utf8proc)估算宽度
真要处理中文对齐,得先转成可视宽度计数,再补空格——这一步没法绕开,而且不同终端渲染可能还不一致。


















