其他分享
首页 > 其他分享> > C使用cout设置列

C使用cout设置列

作者:互联网

所以我刚开始学习c,我很好奇,如果它是一种用cout合成你的输出的方法,所以它看起来很漂亮,并且在列中结构化

例如.

string fname = "testname";
    string lname = "123";
    double height = 1.6;

    string fname2 = "short";
    string lname2 = "123";
    double height2 = 1.8;

    cout << "Name" << setw(30) << "Height[m]" << endl;
    cout << fname + " " + lname << right << setw(20) << setprecision(2) << fixed << height << endl;
    cout << fname2 + " " + lname2 << right << setw(20) << setprecision(2) << fixed << height2 << endl

输出如下所示:

 Name                   Height[m]
 testname 123              1.60
 short 123              1.80

我希望它看起来像这样:

Name                   Height[m]
testname 123             1.60
short 123                1.80

我试图解决的问题是,我想将高度放在名称的特定位置,但是取决于我所采用的高度值的名称长度要么远离右边,要么非常接近左边.有没有办法来解决这个问题?

解决方法:

首先,使用像std :: cout这样的输出流,您无法及时返回并修改已执行的输出.这是有道理的 – 想象一下std :: cout写入一个文件,因为你用program.exe启动你的程序> test.txt和test.txt在USB驱动器上,同时已断开连接…

所以你必须马上把它弄好.

基本上,有两种方法可以做到这一点.

您可以假设第一列中的任何条目都不会超过一定数量的字符,这是您尝试过的.问题是你的setw处于错误的位置并且该权利应该被保留.必须在要受影响的元素之前放置流操纵器.既然你想要左对齐的列,你需要左:

cout << left << setw(20) << "Name" << "Height[m]" << endl;
cout << left << setw(20) << fname + " " + lname << setprecision(2) << fixed << height << endl;
cout << left << setw(20) << fname2 + " " + lname2 << setprecision(2) << fixed << height2 << endl;

但这种解决方案并不是很普遍.如果你的名字有21个字符怎么办?或者有30个字符?还是100个字符?您真正想要的是一种解决方案,其中列自动设置为只需要的宽度.

唯一的方法是在打印之前收集所有条目,找到最长的条目,相应地设置列宽,然后才打印所有条目.

以下是此想法的一种可能实现:

std::vector<std::string> const first_column_entries
{
    "Name",
    fname + " " + lname,
    fname2 + " " + lname2
};

auto const width_of_longest_entry = std::max_element(std::begin(first_column_entries), std::end(first_column_entries),
    [](std::string const& lhs, std::string const& rhs)
    {
        return lhs.size() < rhs.size();
    }
)->size();

// some margin:
auto const column_width = width_of_longest_entry + 3;

std::cout << std::left << std::setw(column_width) << "Name" << "Height[m]" << "\n";
std::cout << std::left << std::setw(column_width) << fname + " " + lname << std::setprecision(2) << std::fixed << height << "\n";
std::cout << std::left << std::setw(column_width) << fname2 + " " + lname2 << std::setprecision(2) << std::fixed << height2 << "\n";

演化的下一步是将std :: vector推广到一个名为Table的自编写类中,并在循环中迭代Table的行以打印条目.

标签:c,cout,multiple-columns,setw
来源: https://codeday.me/bug/20190829/1762068.html