C++使用setw实现右对齐数字三角形时空格异常如何解决
问题根因
setw设计上就只对紧随其后的第一个输出操作生效,输出完成后宽度会自动重置为默认值,你单独写的循环批量设置setw完全无效,只有最后一次设置的setw(2n-1)作用到了第一行的第一个数字1上,所以第一行有大量空格,后续行没有任何宽度设置直接顶格输出。setw如果遇到输出内容长度≥设置的宽度时,会直接忽略宽度设置,按内容实际长度输出,不会补空格也不会截断内容。- 你原代码里每行数字是多次调用
cout<<j输出的,就算在每行前加setw,也只会作用到第一个数字上,不会对整行生效。
修复方案
这里提供两种实现方式,都可以达到你要的右对齐数字三角效果:
方案1:拼接整行内容后用setw对齐
先把每行的数字拼成完整字符串,再用setw设置整行宽度对齐,符合你原本想用setw的需求:
#include <iostream> #include <iomanip> #include <string> using namespace std; int main() { int n,i,j; cin>>n; for(i=1;i<=n;i++){ string line; for(j=1;j<=i;j++){ line += to_string(j); } // 整行内容作为单个输出项,setw作用于整行 cout << setw(n) << line << endl; } return 0; }
方案2:直接输出缩进空格
逻辑更直观,不需要额外依赖头文件,直接计算每行需要的前置空格数输出即可:
#include <iostream> using namespace std; int main() { int n,i,j; cin>>n; for(i=1;i<=n;i++){ // 输出n-i个前置空格 for(j=1;j<=n-i;j++){ cout << " "; } // 输出数字序列 for(j=1;j<=i;j++){ cout << j; } cout << endl; } return 0; }
效果验证
输入n=5时,两种方案都会输出你期望的结果:
1 12 123 1234 12345
内容的提问来源于stack exchange,提问作者Shashaank Kumar
相关产品推荐
相关产品推荐

