cin.width()和cout.width()問題
阿新 • • 發佈:2019-01-10
前言
最近在跟著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個,不足前面補上兩個空格。
以下以此類推,所以才會出現如此的輸出結構。