1

我最近开始用 c++ 编程,但遇到了一个小问题。如果我希望我的输出结构(假设每一行以名称开头,然后是数字)以将名称正常写入屏幕的方式(每个名称的每个第一个字母都从每个新行的开头开始) ) 并且我希望将后面的数字排成一列,我该怎么做?我希望程序输出如下所示:

Gary         0
LongName     0
VerylongName 0

我希望我的程序以上述方式打印一些东西,但名称长度不同(在这种情况下,'0' 排成一列)。

4

4 回答 4

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;

这里有更多信息...

于 2013-10-28T15:38:48.373 回答
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
于 2013-10-29T12:50:49.290 回答
1

我在这里在黑暗中拍摄,因为您并没有真正包含太多信息......但是,您可以这样做的一种方法是确保您在名称周围创建带有填充的列 - 而不必担心数字。Formatted output是 C 优于 C++(恕我直言)的一种情况。在 C++ 中,您也可以使用以下方式执行此操作:

cout << setw(15) << name << number << "\n";

如果您提前计算出您拥有的名称的最大长度并添加,例如 4,则可以获得奖励积分。

于 2013-10-28T15:38:12.327 回答
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;
}  
于 2013-10-28T15:47:16.157 回答