- 面試中筆試常會遇
ACM模式(需要寫主函式、輸入輸出),這里總結一下,方便后續查看,
- 1. cin
- 1.1 operator>>
- 1.2 get()
- 1.3 getline()
- 1.4 cin 的條件狀態
?
1. cin
?? <iostream> 是 Input Output Stream 的縮寫,是標準的輸入、輸出流庫,定義了標準的輸入、輸出物件,
?? Including <iostream> 還會自動包含<ios>,<streambuf>,<istream>,<ostream>和<iosfwd>,
??Note:
iostream類主要宣告在頭檔案<istream>中,
?? 輸入流: std::cin 是 istream 類的物件,它主要面向窄字符(narrow characters (of type char))的標準輸入流,
?? 輸出流: std::cout 是 ostream 類的物件,它主要面向窄字符(narrow characters (of type char))的標準輸出流,
?? 在理解
cin功能時,不得不提標準輸入緩沖區,當我們從鍵盤輸入資料的時候,需要敲一下回車鍵才能夠將這個資料送入到緩沖區中,那么敲入的這個回車鍵(\r)會被轉換為一個換行符’\n’,這個換行符也會被存盤在cin的緩沖區中并且被當成一個字符來計算!
?? 比如我們在鍵盤上敲下了 123456 這個字串,然后敲一下回車鍵(\r)將這個字串送入了緩沖區中,那么此時緩沖區中的位元組個數是 7 ,而不是 6,
??cin讀取資料也是從緩沖區中獲取資料,緩沖區為空時,cin的成員函式會阻塞等待資料的到來,一旦緩沖區中有資料,就觸發cin的成員函式去讀取資料,
- I.
std::cin可以連續從鍵盤讀取想要的資料,并忽略空格、tab 或 換行符, - II. 可通過函式
cin.fail()判斷cin是否成功從緩沖區讀取資料,若剛進行的操作失敗,則回傳真,否則回傳假, - III. 可通過函式
cin.eof()判斷 是否檢測到檔案尾,linux可通過Ctrl+D(window可過Ctrl+Z)模擬檔案尾,當檢測到 EOF后,cin.eof()回傳true,
?
1.1 operator>>
operator>>應用于輸入流std::cin的運算子(operator >>)稱作提取運算子,
? I. 通常使用
while(cin >> a)來讀取輸入資料,因為operator>>函式回傳物件istream&,當讀取成功時bool(cin>>tmp)值為true,反之為false,
? II: 因為operator>>函式回傳輸入流物件istream&,所有可以使用cin>>a>>b來進行讀取,
operator >>函式原型如下:
istream& operator>> (bool& val); // arithmetic types (1)
istream& operator>> (short& val); // >> 右側為緩沖區資料:
istream& operator>> (unsigned short& val);
istream& operator>> (int& val)
... // 此處省略其他同型別函式
istream& operator>> (streambuf* sb ); // stream buffers (2)
istream& operator>> (istream& (*pf)(istream&)); // manipulators (3)
istream& operator>> (ios& (*pf)(ios&));
istream& operator>> (ios_base& (*pf)(ios_base&));
?? 測驗代碼-1:
int main () {
int tmp = 999;
cin >> tmp;
cout << "int value: " << tmp
<< " \nbool(cin): " << bool(cin)
<< " \ncin.eof : " << cin.eof()
<< " \ncin.fail : " << cin.fail() << endl;
return 0;
}
輸入: W ?????? // W不是int型別匹配的資料,因此讀取失敗,temp設定為 0
列印:int value: 0
???bool(cin): 0
???cin.eof : 0
???cin.fail :1
輸入: 100 ?????? // 讀取成功,temp設定為100,
列印:int value: 100
???bool(cin): 1
???cin.eof : 0
???cin.fail :0
?? 測驗代碼-2:
int main () {
vector<int> data;
int tmp;
while (cin >> tmp){ // 讀取資料,將資料插入 vector中
data.push_back(tmp);
if (cin.get() == '\n') // cin.get()讀取 ','
break;
}
for (auto& i:data) // 列印 vector
cout << i << " ";
return 0;
}
輸入:1,2,3,4,5
列印:1 2 3 4 5
輸入:1,2,3,4, ,5
輸出:1 2 3 4
cin >> temp會讀取一個匹配型別,并將后續資料留在輸入緩沖區中,- 上述列子中,可以看出
cin.get()可幫忙讀取一個間隔','字符,當連續輸入兩個','字符時,cin讀取到第二個','字符,因此bool(cin>>temp)為 false,回圈結束,導致 5 并未插入陣列中,
?
1.2 get()
- get() 有多種多載形式:
- I.
get()或get(ch)可讀取緩沖區的下一個字符,哪怕是空格或回車,因此可以使用它來讀取分隔符,
int get();
istream& get(char& c);
?? 測驗代碼-1:
int main () {
vector<int> data;
int tmp;
char ch;
cin.get(ch);
cin >> tmp;
cout << ch << tmp; // 即使 ch 為空格或回車,都會列印ch
return 0;
}
?
- II. 下述原型函式中,函式
get()從緩沖區讀取字串并將其存盤在 C 風格的字串中,
istream& get(char* s, streamsize n);
istream& get(char* s, streamsize n, char delim);
get(char* s, streamsize n):引數1為陣列地址,引數n為讀取的字符數,停止讀取的條件如下:
? (1) 讀取程序中遇到換行符時,停止讀取,并在該位置處將'\0'插入陣列,換行符留在輸入佇列中,
? (2) 若輸入字串長度大于 n,則讀取 n-1 個字符,最后一個字符自動補'\0',
??get(char* s, streamsize n, char delim): 引數delim為分隔符,
? 如果找到了分隔符,則將分隔符保留在輸入佇列中,
? 對于n>0,即便讀取的是空字串,也會在字串中補一個'\0',
?? 測驗代碼-2:
// istream& get(char* s, streamsize n);
int main() {
char ch;
char array[20];
cin.get(array,20);
cin.get(ch);
cout << array << " " << int(ch) << endl;
return 0;
}
輸入:fufu!
列印:fufu! 10
分析:cin.get(array,20);讀取一行時,遇到換行符時結束讀取,并在該位置處將'\0'插入陣列,換行符留在輸入佇列中(緩沖),cin.get()將換行符讀入變數 ch,列印輸入換行符的ASCII碼值為 10,
?? 測驗代碼-3:
// istream& get(char* s, streamsize n, char delim);
int main() {
char ch;
char array[20];
cin.get(array,20,'A'); // 使用分隔符,遇到‘A’停止,‘A’留在輸入緩沖中
cin.get(ch);
cout << array << " " << int(ch) << endl;
return 0;
}
輸入:fufu …~ A
輸出:fufu …~ 65
可以看到,cin.get(ch)讀取到緩沖中的字符A,列印int型別為65.
?
- III. 還有一種引數型別為
streambuf的get()函式,
istream& get(streambuf& sb); // 3. stream buffer
istream& get(streambuf& sb, char delim);
?
1.3 getline()
- 從函式名可以看出,該函式讀取一行資料,
getline()函式與get()功能相似,不同在于當遇到換行符時,getline()將丟棄換行符,而get()將換行符保留在輸入緩沖中,
istream& getline(istream& is, string& str);
istream& getline(istream& is, string& str, char delim);
int main() {
char name[20];
cin.getline(name,20); // 1. 舍棄換行符
char age[10];
cin.getline(age,20,'A'); // 2. 分隔符‘A’
char ch;
cin.get(ch);
cout << "name: " << name;
cout << " age: " << age;
cout << " ch: " << int(ch);
return 0;
}
輸入:
?? fufu
??13!A
列印:
??name: fufu?age: 13!?ch: 10
- 可以看出,讀取名稱
fufu后,舍棄了換行符, - 繼續讀取
13!A時,遇到分隔符'A',丟棄'A',此時輸入緩沖區還剩下換行符, cin.get(ch)讀取換行符,列印出來對應的int為10.
?
1.4 cin 的條件狀態
-
最開始時簡單的講解了
cin.fail()和cin.eof(),此處對cin物件的條件狀態進行介紹: -
條件狀態識別符號號為有:
goodbit 無錯誤 eofbit 已到達檔案尾 failbit 非致命的輸入/輸出錯誤,可挽回 badbit 致命的輸入/輸出錯誤,無法挽回 ### 函式功能 ### s.eof() 若流s 的eofbit置位,則回傳true; s.fail() 若流s 的failbit置位,則回傳true; s.bad() 若流s 的badbit置位,則回傳true; s.good() 若流s 的goodbit置位,則回傳true; s.clear(flags) 清空狀態標志位,并將給定的標志位flags置為1,回傳void, s.setstate(flags) 根據給定的flags條件狀態標志位,將流s 中對應的條件狀態位置為1,回傳void, s.rdstate() 回傳流s 的當前條件狀態,回傳值型別為strm::iostate
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/265419.html
標籤:其他
