C++使用setw对齐ASCII图形时对下划线、短横线不生效问题求助
问题原因
std::setw仅作用于下一个输出项,作用是指定该输出项的最小总宽度:如果输出项本身的长度小于设定值,会根据当前对齐方式补填充字符(默认是空格);如果输出项本身长度已经大于等于设定值,setw不会做任何截断或填充,直接完整输出内容。- 你代码里的下划线、斜杠组成的每行字符串长度都远大于你设置的
setw(15)、setw(14)等值,所以setw直接失效,不会补左侧空格。你测试字母时生效是因为当时测试的字符串长度小于setw设定值。
解决方法
两种方案可选:
方案1:先单独输出指定长度的空格,再输出内容
这种方式不用计算每行字符串的总长度,逻辑更直观:你需要每行左侧补N个空格,就用setw(N) << "" 输出N个空格即可(空字符串长度为0,setw(N)会补N个空格达到最小宽度要求)。
修改后的代码如下:
#include<iostream> #include<iomanip> using namespace std; int main() { cout << setw(11) << "" << "_________________________________________________________" << endl ; cout << setw(10) << "" << "/ \\" << endl; cout << setw(9) << "" << "/ \\" << endl; cout << setw(8) << "" << "/ \\" << endl; cout << setw(7) << "" << "/ \\" << endl; cout << setw(6) << "" << "/ \\" << endl; cout << setw(5) << "" << "/ \\" << endl; return 0; }
方案2:调整setw的值为总宽度
默认cout是右对齐,所以你可以把setw的值设置为【左侧空格数 + 当前行字符串的总长度】,也能达到同样的效果,比如第一行字符串长度为57,左侧要11个空格,总宽度就是68,设置setw(68)即可。
内容的提问来源于stack exchange,提问作者M.Sohail Shahbaz
相关产品推荐
相关产品推荐

