结构化输出 最近我开始用C++编程,我碰到了一个小问题。如果我希望我的输出结构(假设每一行都以一个名称开头,然后是一个数字)使名称正常写入屏幕(每个名称的每个第一个字母都从每一行的开头开始),并且我希望后面的数字排列在一列中,我将如何做到这一点?我希望程序输出如下所示: Gary 0 LongName 0 VerylongName 0 cout << setw(15) << name << number << "\n";

结构化输出 最近我开始用C++编程,我碰到了一个小问题。如果我希望我的输出结构(假设每一行都以一个名称开头,然后是一个数字)使名称正常写入屏幕(每个名称的每个第一个字母都从每一行的开头开始),并且我希望后面的数字排列在一列中,我将如何做到这一点?我希望程序输出如下所示: Gary 0 LongName 0 VerylongName 0 cout << setw(15) << name << number << "\n";,c++,c++11,C++,C++11,我想让我的程序以上面的方式打印一些内容,但名称的长度不同(本例中的“0”排成一列)。我在这里是在黑暗中拍摄的,因为您没有包含太多信息。。。但是,可以这样做的一种方法是确保在创建列时在名称周围填充空格,而不必担心数字格式化输出是其中一个C优于C++(IMHO)的情况。在C++中,你也可以用这样的方式来做:< /P> Gary 0 LongName 0 VerylongName 0 cout << setw(15) << name <<

我想让我的程序以上面的方式打印一些内容,但名称的长度不同(本例中的“0”排成一列)。

我在这里是在黑暗中拍摄的,因为您没有包含太多信息。。。但是,可以这样做的一种方法是确保在创建列时在名称周围填充空格,而不必担心数字<代码>格式化输出是其中一个C优于C++(IMHO)的情况。在C++中,你也可以用这样的方式来做:< /P>
Gary         0
LongName     0
VerylongName 0
cout << setw(15) << name << number << "\n";

cout我在黑暗中拍摄,因为你没有包含太多信息。。。但是,可以这样做的一种方法是确保在创建列时在名称周围填充空格,而不必担心数字<代码>格式化输出是其中一个C优于C++(IMHO)的情况。在C++中,你也可以用这样的方式来做:< /P>
Gary         0
LongName     0
VerylongName 0
cout << setw(15) << name << number << "\n";

<代码> CUT

尝试如下:如果你知道所有要打印的名字的最大长度(例如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;
#包括
#包括
...
//对于每个条目

STD::CUT

尝试以下内容:如果你知道所有要打印的名字的最大长度(例如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;
#包括
#包括
...
//对于每个条目
std::cout
struct X
{
常量字符*s;
int-num;
}选项卡[]={
{“Gary”,1},
{“LongName”,23},
{“VeryLongName”,456}
};
内部主(空)
{
对于(int i=0;istruct X
{
常量字符*s;
int-num;
}选项卡[]={
{“Gary”,1},
{“LongName”,23},
{“VeryLongName”,456}
};
内部主(空)
{
对于(int i=0;iSTD::CUT< P>不在C++标准库中,但仍然值得一提:它将允许您在类型安全的同时编写类似于格式字符串的打印格式。
例如:

#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;
}  

<>不是在C++标准库中,但还是值得一提的是:它将允许您在类型安全的同时编写类似格式字符串的打印格式。 例如:

#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;
}  

你会怎么做?好吧,每次你输出一行时,你都要写一个名字,然后写一个数字,并确保数字在一列中对齐。否则你会怎么做?在输出部分的每行前面放4个空格以获得更清晰的格式,你要问的有点不清楚。把它放在一个表中(“出于某种原因,该网站不允许我以可见的方式书写多个空格”)站在我们的立场上——阅读你的帖子,试着找出你想要的是什么。什么网站…?你会怎么做?好吧,每次你输出一行,你都要写一个名字,然后写一个数字,并确保数字排成一列。否则你会怎么做?在输出部分的每行前面放4个空格,以获得更清晰的格式,我想有点不清楚你在问什么。把它放在一个表中(“网站出于某种原因不允许我以可以看到的方式写几个空格”)跳进我们的鞋子-阅读你的帖子,试着找出你想要什么。什么网站…?为什么你认为C更好。在那里你必须找到最大长度。使用它来构建一个格式字符串,然后使用格式字符串来进行打印。看起来像是一个额外的间接层来构建一个带有数字的字符串。嗯,我很瘦k做一些类似printf的事情(“%-15s%3d”,名称,数字)很容易处理,并且肯定会处理OP所要求的任何东西……我可以同意格式化输出操作符在C.中更紧凑,但是记住那些操作符的所有细节在两种语言中都是一样困难的。C++的缺点是它更冗长。但是收益是类型安全的。在C输入/输出中,有很多bug(崩溃)的来源。在C++中,这是不可能发生的(编译器告诉你什么时候类型不对齐)。但是即使在C++中(带有Boost)您可以使用C中流行的旧奥术输出格式说明符:请参阅,但回到实际情况:
printf(“%-15s%3d”,名称,编号)
是不够的。您实际上需要基于最大名称构建格式字符串,以确保它们正确对齐:
sprintf(格式,%%-%ds%%3d”,大小);printf(格式,名称,编号);
如果你不知道你的名字会有多长,并且担心你需要动态地解决这个问题,那么这看起来比
读起来要困难得多,当然,但是如果你可以抛出一个值20或者更容易处理的值。在C语言中,你可以将文本向左对齐,数字向右对齐,不需要太麻烦。无论如何,正如我前面提到的,这是一个很难的。这是一个观点,你问我为什么这样想,我解释说。你可以继续喜欢C++的SET*输出格式化程序,在那里我会继续认为每天使用都很乱。