C++程序使用setfill()为不足三位的书柜编号补前导0的实现问题
解决方法
你需要在输出m_BookcaseNumber前临时设置填充字符为0、输出宽度为3,输出完成后立刻将填充字符改回默认的空格,避免影响其他位置的填充逻辑。核心逻辑说明:
setw(n)仅对紧接着的下一个输出项生效,刚好只会给书柜编号设置最小3位的输出宽度- 编号长度≥3时会直接输出不会被截断,符合3位编号不补的要求
- 编号长度<3时会用当前设置的
0填充前导空位,自动补全到3位
修改后的完整代码
#include <iomanip> // 确认已引入该头文件,提供setw、setfill方法 std::ostream& Book::write(std::ostream& ostr, bool onScreen) const { if (onScreen) { if (*this) { ostr << m_BookTitle; ostr << setw(42 - strlen(m_BookTitle)) << setfill(' '); ostr << "| " << m_AuthorName; ostr << setw(27 - strlen(m_AuthorName)) << setfill(' '); // 修改书柜编号的输出逻辑 ostr << "| " << m_ShelfNumber << "/" << setfill('0') << setw(3) << m_BookcaseNumber << setfill(' '); } else { ostr << "Invalid Book Record ................... | ........................ | ....."; } } else { if (*this) { // 如果文件导出也需要补前导0的格式,这里也做相同修改,否则保留原代码即可 ostr << m_BookTitle << "," << m_AuthorName << "," << m_ShelfNumber << "/" << setfill('0') << setw(3) << m_BookcaseNumber << setfill(' '); } } return ostr; }
注意事项
如果m_BookcaseNumber是字符串类型,需要确保输出对齐方式为默认的右对齐,避免前导0补到末尾,可在setw(3)前加std::right显式指定对齐规则。
内容的提问来源于stack exchange,提问作者Sufiyan Mustafa
相关产品推荐
相关产品推荐

