我不理解下面的表达式中的逻辑,尽管它完美地运行:
cout << left << setw(6) << "hello" << "there." ;
之前的代码正确输出了我的期望:hello there.
我的逻辑是:
cout << "hello" << left << setw(6) << "there.";
但是它会输出一些意想不到的东西:hellothere.
我的期望是“有”的第一个字符“t”在输出区域的第7列之后是6列宽度之后。换句话说,我的概念是“left setw(n)”应该表示“输出区域中第一个的n列(空格)”,就像一些带有编号列的数据表格一样,便于查找数据。
你能解释一下吗?
答案 0 :(得分:5)
setw
iostreams操纵器适用于输出的 next 项目,仅适用于该项目。因此,在第一个代码段中,"hello"
被修改为“left,field width 6”,从而产生以下输出:
|h|e|l|l|o| |
默认情况下,填充字符是空格(' '
),这是没有更多输入数据且尚未达到字段宽度时的输出。
在第二个代码段中,仅操作项"there."
。由于它已经由六个输出字符组成,因此操纵器无效。
答案 1 :(得分:1)
操纵者改变ostream
的状态。所以他们应该在之前应用要求输出内容。
在你的情况下,你问:
因此,流输出单词&#34; hello&#34;然后是1个空格,达到6的大小,正如操纵者序列所要求的那样。
你可以在那里找到参考资料:
我引用最重要的句子std::left + operator <<
:
if(os.flags()&amp; ios_base :: adjustfield)== ios_base :: left,将os.width() - str.size()副本放在字符序列后面的os.fill()字符中/ p>
std::setw
:
The width property of the stream will be reset to zero (meaning "unspecified") if any of the following functions are called:
Input
operator>>(basic_istream&, basic_string&)
operator>>(basic_ostream&, char*)
Output
Overloads 1-7 of basic_ostream::operator<<() (at Stage 3 of num_put::put())
operator<<(basic_ostream&, char) and operator<<(basic_ostream&, char*)
operator<<(basic_ostream&, basic_string&)
std::put_money (inside money_put::put())
std::quoted (when used with an output stream)