贝利信息

c++中如何实现字符串左填充或右填充_c++字符串对齐方法【详解】

日期:2026-01-18 00:00 / 作者:尼克
最常用轻量填充方式是std::setw与std::setfill配合std::left/std::right,仅对下一个输出项生效;手动构造需用insert/append避免截断;resize仅支持右填充且会截断,UTF-8下慎用。

std::setwstd::setfill 做流式填充

这是最常用、最轻量的左/右填充方式,适用于输出到 std::cout 或字符串流。它不修改原字符串,只在格式化输出时生效。

关键点:必须搭配 std::leftstd::right(默认右对齐),且 std::setw 只对**下一个输出项**有效,不可复用。

#include 
#include 
#include 

std::string s = "abc"; std::ostringstream oss;

oss << std::right << std::setfill('0') << std::setw(6) << s; // 结果: "000abc"(左填充0)

oss.str(""); // 清空 oss << std::left << std::setfill('*') << std::setw(6) << s; // 结果: "abc**"(右填充

std::string::insertstd::string::append 手动构造填充

当需要真正生成新字符串(比如存入容器、传参、做计算),不能依赖流格式化时,就得手动拼接。这种方式可控性强,但要注意边界:如果原字符串长度 ≥ 目标宽度,多数实现会直接返回原串(不截断)。

#include 
#include 

std::string pad_left(const std::string& s, size_t target_len, char c = ' ') { if (s.length() >= target_len) return s; return std::string(target_len - s.length(), c) + s; }

std::string pad_right(const std::string& s, size_t target_len, char c = ' ') { if (s.length() >= target_len) return s; return s + std::string(target_len - s.length(), c); }

注意 std::string::resize 的陷阱:它会截断或填充,但方向固定

std::string::resize(n, c) 看起来很适合填充,但它只支持**右填充**(即在末尾补字符),且当 n 时会**无条件截断**——这和多数“填充函数”预期不符(通常期望保持原内容不变)。

std::string s = "你好";
s.resize(10, '*'); // 若原始是UTF-8,长度为6字节,resize(10)会在末尾加4个'*'
// 但若写成 s.resize(5, '*'),会截掉至少1个中文字符,结果不可控

C++20 起可用 std::format,但要注意兼容性和宽度单位

std::format 提供类似 Python 的格式语法,支持 {:>8}(右对齐宽8)、{:*(左对齐、*填充、宽8)。但它对“宽度”的理解是**字符数(code points)**,不是字节数;而 std::string 是字节容器,遇到 UTF-8 多字节字符时,std::format 会尝试解码,但标准库实现质量参差不齐。

实际项目中,如果还没强制要求 C++20,老老实实用 std::stringstre

am 或手动拼接更稳妥。