C++輸入獲取未知長度的行輸入陣列 與 輸出控制
阿新 • • 發佈:2019-01-02
標頭檔案 #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)。