1. 程式人生 > >cin.width()和cout.width()問題

cin.width()和cout.width()問題

前言

最近在跟著FishC大佬學C++,碰到了一個很有趣的輸入輸出問題,多方查資料,有了點心得,記錄一下。

cin與cout的功能雖然不同,但它們有許多類似點,如都可以指定域寬。cin的輸入域寬可以使用操作符setw指定,也可使用cin.width函式成員指定。cin在讀入一個字串時,不能根據字元陣列的長度自動讀入字元,如果使用者輸入過多的字元,超過了字元陣列的長度,cin會將多餘字元儲存到該陣列的後面,這就有可能覆蓋其他變數。如果我們為其指定了輸入域寬,就可解決這一問題。

如果所需的寬度比設定的域寬小,空位用填充字元填充。如果顯示資料所需的寬度比設定的域寬大,系統輸出所有位。域寬設定僅對下一行流讀入或流插入操作有效,在一次操作完後被置0。

正文

#include <iostream>

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()的域寬一直為5,由於存在最後一個字元是空字元的情況,所以實際上每次只讀取4個字元,其他的字元放在流中等待下次接受。 

第一行輸出 May, 此時,cin.width = 5,cout.width = 4,遇到空格自動停止接收,位數不足4位,前補一個空格。

第二行輸出  You,此時,cin.width = 5,cout.width = 5,遇到空格自動停止接收,所以所以讀入3個字元,輸出5個,不足前面補上兩個空格。

以下以此類推,所以才會出現如此的輸出結構。