【问题标题】:Using c++ setw to try to align second column使用 c++ setw 尝试对齐第二列
【发布时间】:2016-02-07 03:09:42
【问题描述】:

我试图确保输出中的第二列是对齐的,看起来 setw 将是解决方案,但不管我做什么,第二列总是关闭。这是我从下面的代码中得到的输出......

1> 123
10> 234

但我希望它是......

1>   123
10>  234

我能想到的唯一另一件事是实际获取元素的实际数量和索引的位数,然后从中进行某种长度计算。为了使第二列右对齐,这似乎需要很多处理。

我也试过

int main()
{
    int array[2] = {123,234};
    int array2[2] = {1, 10};

    for(int i = 0; i < 2; i++){
        cout << array2[i] << "> " << setw(4) << array[i] << endl;
    }

    return 0;
 }

【问题讨论】:

    标签: c++ setw


    【解决方案1】:

    使用setw ():

    您需要为 array2[i] 元素而不是 array[i] 元素设置宽度,以获得您正在寻找的对齐方式。

    cout << setw (2) << array2[i] << "> " << array[i] << endl;
    

    替代方法 1:

    在此处使用printf 进行格式化打印。

    printf ("%-2d> %4d\n", array2[i], array[i]);
    

    %-2d - -2 左对齐宽度为 2 的整数。

    %4d - 4 右对齐宽度为 4 的整数。

    替代方法 2:

    使用制表符或\t 字符。

    cout <<  array2[i] << ">\t" << array[i] << endl;
    

    \t 将您的光标栏移动到下一个制表位,因此您最终可以根据需要在列中对齐数据。我不建议你使用这种方法,因为标签宽度是不可预测的。

    【讨论】:

    • 谢谢!对于第一种方法,它会将 1> 向右推一个空格。我想让它保持对齐。我会尝试 printf 选项!我也必须添加字符串,但应该是可行的
    • 我仍然无法获得我想要的格式,但这是因为数字前面的字符。我最终将数字转换为字符串并将其连接到字符中。然后我就可以正确使用 setw
    【解决方案2】:

    使用单个'\t' 字符,它会自动切换到另一列。示例:

    for(int i = 0; i < 10; i++)
          cout << "x=" << (rand()%10000000+2000)/30 << "\t\ty=" << rand()%2000 << endl;
    

    输出是:

    x=+231096       y=+1383
    x=+154630       y=+777
    x=+141344       y=+1793
    x=+325416       y=+1386
    x=+321447       y=+649
    x=+16400        y=+362
    x=+84068        y=+690
    x=+250530       y=+1763
    x=+12847        y=+540
    x=+115257       y=+1172
    

    注意:我在 C++11 中使用带有标志 -std=c++11 的 g++,我不知道它会影响结果。

    【讨论】:

    • 是的,在语义上是正确的,但实际上这可能达不到预期的效果。这是因为制表符宽度是不可预测的,并且您的数据可能不适合某些人的设置。可以说,在这里使用异端并使用空格会更好。
    • Tab 确实对齐它但是是的,我无法控制空格的数量。从技术上讲,我想要什么
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多