我试图让我的输出看起来像这样:
size time1 time2
-------------------------------
10 4 8
100 48 16
1000 2937 922
10000 123011 3902
100000 22407380 830722
我知道我需要使用setw()
,setfill()
和left
。但是,我的尝试一直给我不正确的输出。以下是我的代码的一个示例:
std::cout << "size" << std::setw(20) << "time" << std::setw(20) << "time2\n";
std::cout << std::setfill('-') << std::setw(60) << "-" << std::endl;
run = 10;
for(int i = 0; i < 5; i++) {
std::cout << run;
run *= 10;
std::cout << std::setw(20) << std::left << time1[i];
std::cout << std::setw(20) << std::left << time2[i] << "\n";
}
这是输出:
size time1 time2
------------------------------------------------------------
103-------------------13------------------
100171-----------------199-----------------
100013183---------------667-----------------
10000670130--------------8205----------------
10000014030798-------------1403079888---------
我尝试使用setw()
,setfill()
和left
更改我的订单,但我现在只是盲目地飞行。我也搜索了iomanip教程。我按照指示 - 据我所知 - 但我仍然没有得到它。
如何阻止setfill()
跑过来?我如何证明左,但使用setw()
来阻止数字相互碰撞?
答案 0 :(得分:6)
怎么样:
std::cout << "size" << std::setw(20) << "time" << std::setw(20) << "time2\n";
std::cout << std::setfill('-') << std::setw(60) << "-" << std::endl;
run = 10;
std::cout << std::setfill(' '); //fill with spaces
for(int i = 0; i < 5; i++) {
std::cout << std::setw(20) << std::left << run; // fill the run column
run *= 10;
std::cout << std::setw(20) << std::left << time1[i];
std::cout << std::setw(20) << std::left << time2[i] << "\n";
}
答案 1 :(得分:1)
sj0h的答案很棒,除了标题不排队。要修复它,我用“left”和“setw”开始标题行,我也必须以“endl”而不是“\ n”结尾。
std::cout << std::left << std::setw(20) << "size" << std::setw(20) << "time" << std::setw(20) << "time2" << std::endl;
std::cout << std::setfill('-') << std::setw(60) << "-" << std::endl;
run = 10;
std::cout << std::setfill(' '); //fill with spaces
for(int i = 0; i < 10; i++) {
std::cout << std::setw(20) << std::left << run; // fill the run column
run *= 10;
std::cout << std::setw(20) << std::left << time1[i];
std::cout << std::setw(20) << std::left << time2[i] << std::endl;
}
答案 2 :(得分:0)
在 C++20 中,您将能够使用 std::format
来执行此操作:
std::cout << std::format("{:20}{:20}{:20}\n", "size", "time", "time2");
std::cout << std::format("{:-<60}\n", "");
int run = 10;
for(int i = 0; i < 5; i++) {
std::cout << std::format("{:<20}{:<20}{:<20}\n", run, time[i], time2[i]);
run *= 10;
}
输出:
size time time2
------------------------------------------------------------
10 4 8
100 48 16
1000 2937 922
10000 123011 3902
100000 22407380 830722
在此期间您可以使用 the {fmt} library,std::format
是基于。 {fmt} 还提供了 print
函数,使这变得更加简单和高效 (godbolt):
fmt::print("{:20}{:20}{:20}\n", "size", "time", "time2");
fmt::print("{:-<60}\n", "");
int run = 10;
for(int i = 0; i < 5; i++) {
fmt::print("{:<20}{:<20}{:<20}\n", run, time[i], time2[i]);
run *= 10;
}
免责声明:我是 {fmt} 和 C++20 std::format
的作者。