1. 程式人生 > >C++輸入獲取未知長度的行輸入陣列 與 輸出控制

C++輸入獲取未知長度的行輸入陣列 與 輸出控制

標頭檔案 #include <iostream>

程式的輸入都建有一個緩衝區,即輸入緩衝區。一次輸入過程是這樣的,當一次鍵盤輸入結束時會將輸入的資料存入輸入緩衝區,而cin函式直接從輸入緩衝區中取資料。正因為cin函式是直接從緩衝區取資料的,所以有時候當緩衝區中有殘留資料時,cin函式會直接取得這些殘留資料而不會請求鍵盤輸入

cin的三種方式

cin >> n;                       //Enter、Space、Tab作為結束條件(會將其丟出緩衝區)
ch = cin.get() | cin.get(ch)    //Enter作為結束符(不丟棄緩衝區中的Enter,即下次輸入的是enter)
cin.getline(陣列名,長度,結束符) 大體與 cin.get(陣列名,長度,結束符)類似。

cin.get()當輸入的字串超長時,不會引起cin函式的錯誤,後面的cin操作會繼續執行,只是直接從緩衝區中取資料。但是cin.getline()當輸入超長時,會引起cin函式的錯誤,後面的cin操作將不再執行。

變長輸入

當輸入資料的長度不固定時,即以輸入結束符結束時:

abcd...balabla+enter
Ctrl + Z
enter

此時要獲取緩衝區中的字元或者陣列可以通過以下方式:

char ch;
ch = cin.get();

示例:

#include <iostream>
#include<algorithm> #include <vector> using namespace std; void getin(vector<int> &vec){ int val = 0; char ch; bool flag = 0, minus = 0; //flag用來標註最後一個val是否輸入到vec中,minus判斷是否為負 while(ch = cin.get()){ if(ch == '\n') //如果是換行符,結束 break
; if(ch == ' '){ //如果是空格,將空格前的數插入到vec中,開始記錄新的數 vec.push_back(val); val = 0; flag = 1; minus = false; continue; } if(ch == '-'){ minus = true; continue; } flag = 0; if(minus == true){ val = val*10-(ch-'0'); }else{ val = val*10+ch-'0'; } } if(flag == 0) vec.push_back(val); } int main(){ vector<int> vec; getin(vec); for(int i = 0; i < vec.size(); i++){ cout << vec[i] << " "; } cout << endl; return 0; }

在輸入流與輸出流中使用控制符

需要注意的是: 如果使用了控制符,在程式單位的開頭除了要加iostream標頭檔案外,還要加iomanip標頭檔案。

舉例: 輸出雙精度數。

double a=123.456789012345;                                      //對a賦初值
(1) cout<<a;                                                    //輸出: 123.456
(2) cout<<setprecision(9)<<a;                                   //輸出: 123.456789
(3) cout<<setprecision(6);                                      //恢復預設格式(精度為6)
(4) cout<< setiosflags(ios∷fixed);                              //輸出: 123.456789
(5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;           //輸出: 123.45678901
(6) cout<<setiosflags(ios∷scientific)<<a;                       //輸出: 1.234568e+02
(7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a;      //輸出: 1.2346e02

下面是整數輸出的例子:

int b=123456;                               //對b賦初值
(1) cout<<b;                                //輸出: 123456
(2) cout<<hex<<b;                           //輸出: 1e240
(3) cout<<setiosflags(ios∷uppercase)<<b;    //輸出: 1E240
(4) cout<<setw(10)<<b<<','<<b;              //輸出:  123456,123456
(5) cout<<setfill('*')<<setw(10)<<b         //輸出: **** 123456
(6) cout<<setiosflags(ios∷showpos)<<b;      //輸出: +123456

如果在多個cout語句中使用相同的setw(n),並使用setiosflags(ios∷right),可以實現各行資料右對齊,如果指定相同的精度,可以實現上下小數點對齊。

例3.1 各行小數點對齊。

#include <iostream>
#include <iomanip>
using namespace std;
int main( )
{
   double a=123.456,b=3.14159,c=-3214.67;
   cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2);
   cout<<setw(10)<<a<<endl;
   cout<<setw(10)<<b<<endl;
   cout<<setw(10)<<c<<endl;
   return 0;
}

輸出如下:
123.46 (欄位寬度為10,右對齊,取兩位小數)
3.14
-3214.67
先統一設定定點形式輸出、取兩位小數、右對齊。這些設定對其後的輸出均有效(除非重新設定),而setw只對其後一個輸出項有效,因此必須在輸出a,b,c之前都要寫setw(10)。