制表问题

时间:2011-06-27 21:51:04

标签: c++

我有一些循环:

for(int i=0; i<rolls; i++)
    {
        first = rand()%6+1;
        second = rand()%6+1;
        cout<<'('<<first<<')';
        for(int j=0; j<first; j++)
        {
            cout<<'*';
        }
        cout<<'\t'<<'('<<second<<')';
                for(int j=0; j<second; j++)
        {
            cout<<'*';
        }
        cout<<endl;
    }

它运行良好,但我的输出有一些问题:

CPU             Player
(2)**   (3)***
(4)**** (1)*
(6)******       (5)*****
(5)*****        (6)******
(1)*    (5)*****
(3)***  (1)*
(4)**** (2)**
(3)***  (1)*
(1)*    (5)*****
(5)*****        (4)****
(2)**   (6)******
(5)*****        (3)***

这个表格怎么了?

5 个答案:

答案 0 :(得分:2)

\ t依赖于依赖于您的环境的制表位。

相反,您应该查看iomanip header以指定最小列跨度。另请参阅this answer

答案 1 :(得分:2)

你问为什么它没有在两个整齐的列中对齐?

如果是这样的话,因为\t将插入符移动到下一个制表符停止位置。如果您已经停在制表位上 - 那么您的移动量将超出您的预期。当您打印6个字符然后\t时 - 您将跳转到位置8.如果您打印8个字符然后\t,您将跳转到位置16(假设每8个标签)位置)。

你的情况会发生什么。

修改

这是您问题的答案错误。如何解决 - 请参阅@ retrodrone的答案或duplicate post

答案 2 :(得分:0)

\t的宽度高度依赖于您的特定环境。在您的情况下,看起来您的标签宽度为8;也就是说,\t添加到八个空格,直到当前列可被8整除。由于(5)*****长度为八个字符,\t必须移至下一个标签位置,并添加另外8个空格。但(4)****长度为七个字符,因此\t可以使用一个空格。

简而言之:不要使用\t,明确地移动你想要的许多空格。

答案 3 :(得分:0)

更改

cout<<'\t'<<'('<<second<<')';

cout<< setw(16) << '(' << second << ')';

#include <iomanip>

打印\t字符只是按键盘上的标签键:它会将其移动到下一个制表位,而不是特定制表位。

使用std::setw您可以指定特定的宽度。

答案 4 :(得分:0)

没错。

制表符不会自动为您的内容制表。他们只是将插入符号推进到下一个可用的tabstop。

“下一个可用的tabstop”表示下一个不存在字符的tabstop。对于您的控制台,您的tabstops设置为第一个tabstop恰好落在您的第一个“数据列”的预期长度内。

由于tabstops总是按设计可由最终用户的显示机制配置,因此它们不适合制表。

使用固定的空格,以便保证布局。