跳到主要内容

控制输出长度

cout 在这个功能上比 printf 方便,且强大

目的

有些题目输出的时候,会需要控制长度,比如以下题目:

题目描述
某老师期末发成绩表的时候发现他的表格很不好看,因为没有对齐,以下为成绩表中的一部分,每行表示一个成绩,分别为学号,语文成绩,数学成绩
5 100 99
6 99 100
7 98 86
8 95 100
9 8 77
10 100 100
这时需要添加空格来让表格对齐,请你帮他对齐这些分数,id占2格,成绩都占3格,并且两两中间有空格
样例输出

 5 100  99
6 99 100
7 98 86
8 95 100
9 8 77
10 100 100

这时我们就可以用输出控制长度的功能

cout

使用 <iomanip> 库中的 setw() 控制输出长度

语法

#include <iostream>
#include <iomanip> //需要此头文件
using namespace std;
int main(){
cout<<setw(2)<<9<<" "<<setw(3)<<8<<" "<<77<<endl;
cout<<setw(2)<<10<<" "<<setw(3)<<100<<" "<<100<<endl;
//输出
// 9 8 77 注意:77和100没有对齐
//10 100 100
return 0;
}

setw() 可以设置输出长度

  • 括号里填2表示控制长度为2,当长度不足时补空格,比如9前面就有1个空格
  • 括号里填3表示控制长度为3,当长度不足时补空格,比如8前面就有2个空格
setw() 仅对下一个输出数字有效

如上面样例中77和100就没有对齐。
想要对齐就只有再加 setw()

//                                      ↓增加
cout<<setw(2)<<9<<" "<<setw(3)<<9<<" "<<setw(3)<<77<<endl;
cout<<setw(2)<<10<<" "<<setw(3)<<100<<" "<<setw(3)<<100<<endl;

当长度超出设定,会怎么样

cout<<"我有"<<setw(2)<<9999<<"爬虫币";
//输出:我有9999爬虫币

这时会忽略你设置的长度,有多长就输出多长

如何左对齐

cout<<left; //左对齐left 右对齐right
cout<<setw(2)<<9<<" "<<setw(3)<<8<<" "<<77<<endl;
cout<<setw(2)<<10<<" "<<setw(3)<<100<<" "<<100<<endl;
//输出
//9 8 77 提示:左对齐时每行最后一个不对齐也行
//10 100 100 右对齐时则不行
  • left 控制输出对齐方式为左对齐,持续到再次改为右对齐为止
  • right 控制右对齐

setfill() 设置用其他符号来补

cout<<setfill('0');
cout<<setw(2)<<9<<" "<<setw(3)<<8<<" "<<77<<endl;
cout<<setw(2)<<10<<" "<<setw(3)<<100<<" "<<100<<endl;
//输出
//09 008 77
//10 100 100

printf

语法

printf("%2d %3d %3d\n",9,8,77);
printf("%2d %3d %3d\n",10,100,100);
//输出
// 9 8 77
//10 100 100

其中 %长度d 用来控制输出长度,默认补空格

  • %2d 即长度为2,不足2位的补空格,如9前面补了1个空格
  • %3d 即长度为3,不足3位的补空格,如8前面补了2个空格

当长度超出设定,会怎么样

printf("我有%2d爬虫币",9999);
//输出:我有9999爬虫币

这时会忽略你设置的长度,有多长就输出多长

如何左对齐

printf("%-2d %-3d %-3d\n",9,8,77);
printf("%-2d %-3d %-3d\n",10,100,100);
//输出
//9 8 77
//10 100 100

%-2d 中用-2表示左对齐,长度为2

用0补,而不是空格

printf("%02d %3d %3d\n",9,8,77);
printf("%02d %3d %3d\n",10,100,100);
//输出
//09 8 77
//10 100 100

%02d 中用02表示用0去补

能用别的去补空格吗?不能

比如这里我想用@去补空格

printf("%@5d",9);//输出的是%@5d,直接把字符串输出了
%-02d 这种写法吗?

你可以试试看,但是先想一想学号9的不就变成学号90了吗?