C ++:setw和setfill的行为不可预测

时间:2017-04-19 08:49:43

标签: c++

根据我的理解,setw(n)通过创建n个字符的宽度来起作用。另一方面,setfill(' x')允许我们打印n个x个字符。

我想要获得两排星星,如下:

**************************************
Woohoo stars!
**************************************

另外,我想在字符串的两边创建两条长度相等的点,如下所示:

....................... TEAR HERE .......................

相反,我得到的是这样的东西:

Woohoo stars!
**************************************

.............. TEAR HERE .............................

为了实现这些目标,我使用下面的代码#include<iomanip>(注意:它正在打印到外部.txt文件中):

//goal 1
outfile << setw(40)<<setfill('*') << endl;  
outfile<< "Woohoo stars!" << endl; 
outfile << setw(40)<<setfill('*') << endl; 

//goal 2
outfile <<setfill('.')<< setw(30) " TEAR HERE " << setfill('.')<< setw(30) <<endl;  

我试图故意颠倒setwsetfill的顺序,但在编译后产生了相同的效果。此外,对于星形图案,由于某种原因,顶行甚至不会输出。最后,我确保在一个新行上执行这些命令,因此不会有任何其他干扰它们所在的行。

2 个答案:

答案 0 :(得分:3)

不,setw(n)不会“创建n个字符的宽度”,它会使用指定的填充字符将下一个打印的项目填充到n个宽度。您仍然可以通过打印空字符串使其按预期工作:

outfile << setw(40)<<setfill('*') << "" << endl;

答案 1 :(得分:2)

setw实际上只是设置写入流的下一个东西的宽度,因此“Tear Here”将在宽度为30的字段中右对齐。

解决方案是使用:

outfile <<setfill('.')<< setw(30) << '.' << " TEAR HERE " << setfill('.')<< setw(30) << '.' <<endl;