1.前言
由于本科沒有學過c語言,研究生階段接觸c++上手有點困難,今天遇到關于通過cin.get()來讓黑框維持的原因。
2.思考
cin.get()維持黑框不消失的原因一言蔽之就是等待輸入。等待鍵盤的輸入內容并回車(一般是回車)后cin.get()才能結束,然后黑框也隨之消失。
2.1 從鍵盤輸入
使用輸入操作符讀取單詞,標準庫中提供了iostream,可以使用內置的cin對象,調用重載的輸入操作符>>來讀取鍵盤輸入。
string str;// 讀取鍵盤輸入,遇到空白符停止cin >> str;cout << str<<endl;
這種方式的特點是:忽略開始的空白符,遇到下一個空白符(空格、回車、制表)等就會停止。所以如果我們輸入“hello world”,那么讀取給str的只有“hello”:因為hello后面是空格,屬于空白符,所以停止。這相當于讀取了一個“單詞”。
剩下的內容“ world”其實也沒有丟,而是保存在了輸入流的“輸入隊列”里。如果我們想讀取更多的輸入信息,就需要使用更多的string對象來獲取:
string str1, str2;cin >> str1 >> str2;cout << str1 << str2 << endl;
這樣,如果輸入“hello world”,就可以輸出“helloworld”。雖然空格還在讀取hello后的輸入流中,但是str2的讀取忽略了world之前的空格
接下來看這里的代碼
string str1;cin >> str1;cout << str1 << endl;cin.get();cin.get();
運行效果是輸入hello后輸出hello,同時黑框仍然保持存在,即等待輸入
我們輸入的內容是hello,但是我們在hello后有一個回車符,讀給str1的內容為hello
這里為什么要寫兩個cin.get():第一個用來處理之前保留在輸入隊列的回車符;第二個用來等待下一次輸入,讓窗口保持開啟狀態。
接下來繼續:
以如下代碼為例:
#include<iostream>
using namespace std;
//cin以空白字符串為結束:空格、回車、制表
int main() {string str1;string str2;cin >> str1;cout << str1 << endl;cin.get();cin >> str2;cin.get();cout << str2 << endl;cin.get();//cin.get();//cin.get();
}
該過程大體如下:
標準庫中提供了iostream,使用內置的cin對象,調用重載操作符>>來讀取鍵盤輸入。
我們輸入hello并回車,此時輸入流中就有了:hello和回車符
將hello讀取給str1,此時輸入流還剩下回車符
第8行代碼輸出str1的內容
第9行代碼中,使用cin.get()獲取輸入流的內容,讀取了回車,返回空行。
第10行代碼,繼續cin對象重載>>讀取鍵盤輸入,并將輸入內容給str2
我們輸入say加上回車
str2的內容為say,因為say后面是空白符
輸入流中還剩下回車
第11行代碼使用cin.get()獲取輸入流中的回車符
第12行代碼,輸出str2的內容say
第14行代碼 cin.get()等待下一次輸入,如果不輸入內容并回車的話,窗口一直保持
總結一下:
1.空白符:包括空格,回車,制表符等
2.cin>>str是獲取鍵盤輸入,遇到空白符停止,將內容給str,剩下的部分仍然在輸入流中
3.cin.get()獲取輸入流中的內容,可以讀取空白符
4.cin>>str1>>str2>>str3等此類使用多個str對象,他會忽略開始的空白符,遇到下一個空白符(空格、回車、制表等)就會停止,將該部分中間的內容依次傳給str.例如 我們輸入 “say hello world” 那么str1就是say,str2就是hello,因為他會忽略hello前的空格和后的空格,同理str3是world,他會忽略world前的空格和后的回車符
拓展:
對于代碼
string str1;cin >> str1;cout << str1 << endl;cin.get();cin.get();
如果我們輸入的內容是 hello然后空格,然后回車,那么黑框會保持嗎?答案是不會的,因為str1存儲輸入流的hello,第一個cin.get()獲取輸入流的空白符:空格,返回空行,第二個cin.get()獲取輸入流的回車符,返回空行,沒有cin.get()繼續等待輸入了
如果寫成
string str1;cin >> str1;cout << str1 << endl;cin.get();cin.get();cin.get();
則可以保持黑框等待輸入