C ++的cin.width函数说明

时间:2015-12-23 21:37:53

标签: c++

我已经阅读了这本书中的这段(几乎没有解释过)十几次,但却无法理解它是如何起作用的。我正试图弄清楚这些功能是如何运作的。

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,但是你输出“是”。我不明白这个概念。

4 个答案:

答案 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()将重置为0width()是唯一一个不断重置的格式化标志;所有其他格式化标志保持其值,直到新的格式为设定)。

对于输出,width()指定应打印的字符数。如果要打印的值没有产生足够的字符,则其余字符填充,即使用当前填充字符(使用fill()成员访问)进行写入,至少width()个字符。同样,width()在使用后会重置为0

输入和输出的width() 完全目的不同。可能应该使用不同的成员。特别是,char数组的格式化输入是width()在标准C ++库中输入的唯一用途。