我已经阅读了这本书中的这段(几乎没有解释过)十几次,但却无法理解它是如何起作用的。我正试图弄清楚这些功能是如何运作的。
int main() {
int widthValue = 4;
char sentence[ 10 ];
cout << "Enter a sentence:" << endl;
cin.width( 5 ); // input only 4 characters from sentence
// set field width, then display characters based on that width
while ( cin >> sentence )
{
cout.width( widthValue++ );
cout << sentence << endl;
cin.width(5); // input 5 more characters from sentence
} // end while
return 0;
} // end main
现在生成以下输出,这是我的麻烦。第一行显示cin.width,这一行意味着实际上将读取前4个字符 - 即“This”,但是然后输出字段宽度为4,所以当你执行'cout&lt;&lt; ;句子&lt;&lt;你打印4个字符的endl语句,即 - “这个”。之后,你会从句子中读出另外5个字符。但是我在循环的下一次迭代中迷失了因为宽度然后变为5,但是你输出“是”。我不明白这个概念。
答案 0 :(得分:2)
当您在width(w)
上设置cin
然后从中读取C字符串时,如果发生以下任一情况,则运算符>>
会停止:
w-1
字符已被阅读 - >>
还需要一个字符用于null终止符,它包含在计数中>>
无法执行任何操作。因此,您的循环按如下方式对输入进行分区:
打印是右对齐的,每个单词或之前从cin
读取的单词的一部分预先设置了空格。 widthValue++
表达式控制整体宽度,因此每个下一个单词前面都会有一个额外的空格。
以下为"jackdaws love my big sphinx of quartz"
的{{3}},其中添加了|
个标记以显示每行的开头和结尾:
|jack|
| daws|
| love|
| my|
| big|
| sphi|
| nx|
| of|
| quar|
| tz|
答案 1 :(得分:1)
来自http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2:
如果满足以下条件之一,则提取将停止:
- 找到空格字符(由ctype facet确定)。不提取空白字符。
- st.width() - 提取1个字符
- 文件末尾出现在输入序列中(这也设置了eofbit)
因此,如果你输入的是:
JFrame
在循环的第二次迭代中,This is a line line.
的内容将为sentence
。
答案 2 :(得分:1)
每当你执行一个新的cin >> sentence
时,它会覆盖之前sentence
中的任何内容。输入也在空格处停止。因此,第二个循环只会给你is
答案 3 :(得分:1)
当您使用带有char*
的格式化输入时,流width()
确定适合相应数组的最大字符数。由于流需要以空终止,因此将读取最多s.width() - 1
以允许存储终止空字符。
格式化输入也以跳过前导空格开始,并在到达第一个空格时停止。也就是说,当存储width()-1
字符或达到空格时,输入将停止。输入完成后,当前width()
将重置为0
(width()
是唯一一个不断重置的格式化标志;所有其他格式化标志保持其值,直到新的格式为设定)。
对于输出,width()
指定应打印的字符数。如果要打印的值没有产生足够的字符,则其余字符填充,即使用当前填充字符(使用fill()
成员访问)进行写入,至少width()
个字符。同样,width()
在使用后会重置为0
。
输入和输出的width()
完全目的不同。可能应该使用不同的成员。特别是,char
数组的格式化输入是width()
在标准C ++库中输入的唯一用途。