我最近开始用c ++编程,但我遇到了一个小问题。如果我希望我的输出结构化(让我们说每行以一个名称开头,然后是一个数字),方式是将名称正常写入屏幕(每个新名称的每个第一个字母都从每个新行的开头开始)我希望后面的数字排成一列,我该怎么做?我希望程序输出看起来像这样:
Gary 0
LongName 0
VerylongName 0
我希望我的程序以上面的方式打印,但名称长度不同(在这种情况下为'0',排成一列)。
答案 0 :(得分:4)
尝试以下操作:如果您知道要打印的所有名称的最大长度(例如20),则使用C ++ i / o操纵器设置输出的宽度(和左对齐)。这将强制输出占用max
个字符。
代码段:
#include <iostream>
#include <iomanip>
...
// for each entry
std::cout << std::setw(20) << std::left << "Gary" << 10 << "\n";
...
std::cout << std::flush;
Here还有更多信息......
答案 1 :(得分:1)
我在黑暗中拍摄,因为你还没有真正包含太多信息......但是,你可以做到这一点的一种方法是确保你用名字周围的填充创建列 - 而不用担心数字。 Formatted output
是C优于C ++(恕我直言)的一种情况。在C ++中,你也可以这样做:
cout << setw(15) << name << number << "\n";
如果你提前知道你所拥有的名字的最大长度,并加上4,就可以获得奖励积分。
答案 2 :(得分:1)
不在C ++标准库中,但仍然值得一提:boost::format。它可以让你在类型安全的同时编写类似printf的格式字符串。
示例:
#include <boost/format.hpp>
#include <iostream>
#include <string>
struct PersonData
{
std::string name;
int age;
};
PersonData persons[] =
{
{"Gary", 1},
{"Whitney", 12},
{"Josephine ", 101}
};
int main(void)
{
for (auto person : persons)
{
std::cout << boost::format("%-20s %5i") % person.name % person.age << std::endl;
}
return 0;
}
输出:
Gary 1
Whitney 12
Josephine 101
答案 3 :(得分:0)
struct X
{
const char *s;
int num;
} tab[] = {
{"Gary",1},
{"LongName",23},
{"VeryLongName",456}
};
int main(void)
{
for (int i = 0; i < sizeof(tab) / sizeof(struct X); i++ )
{
// C like - example width 20chars
//printf( "%-20s %5i\n", tab[i].s, tab[i].num );
// C++ like
std::cout << std::setw(20) << std::left << tab[i].s << std::setw(5) << std::right << tab[i].num << std::endl;
}
getchar();
return 0;
}