我有一些循环:
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)***
这个表格怎么了?
答案 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总是按设计可由最终用户的显示机制配置,因此它们不适合制表。
使用固定的空格,以便保证布局。