cin.width()和cout.width()问题

前言

最近在跟着FishC大佬学C++,碰到了一个很有趣的输入输出问题,多方查资料,有了点心得,记录一下。

cin与cout的功能虽然不同,但它们有许多类似点,如都可以指定域宽。cin的输入域宽可以使用操作符setw指定,也可使用cin.width函数成员指定。cin在读入一个字符串时,不能根据字符数组的长度自动读入字符,如果用户输入过多的字符,超过了字符数组的长度,cin会将多余字符存储到该数组的后面,这就有可能覆盖其他变量。如果我们为其指定了输入域宽,就可解决这一问题。

如果所需的宽度比设置的域宽小,空位用填充字符填充。如果显示数据所需的宽度比设置的域宽大,系统输出所有位。域宽设置仅对下一行流读入或流插入操作有效,在一次操作完后被置0。

正文

#include 

using namespace std;

int main()
{
      int width = 4;
      char str[20];

      cout << "请输入一段文本: \n";
      cin.width(5);	//cin>>str;实际只能提取4个字符,str最后一个是空字符,其他的放在流中等待接受。 

      while( cin >> str )
      {
            cout.width(width++);	//将4个字符输出,设置每次输出的域宽增加1 
            cout << str << endl;	//输出str 
            cin.width(5);			//设置接受4个字符 
      }

      return 0;
}

如果输入文本:May You Always Remember How Precious You Are!

结果如下所示:

cin.width()和cout.width()问题_第1张图片

cin.width()的域宽一直为5,由于存在最后一个字符是空字符的情况,所以实际上每次只读取4个字符,其他的字符放在流中等待下次接受。 

第一行输出 May, 此时,cin.width = 5,cout.width = 4,遇到空格自动停止接收,位数不足4位,前补一个空格。

第二行输出  You,此时,cin.width = 5,cout.width = 5,遇到空格自动停止接收,所以所以读入3个字符,输出5个,不足前面补上两个空格。

以下以此类推,所以才会出现如此的输出结构。

 

你可能感兴趣的:(C++入门)