直接用代碼來說好了。
#include<iostream> #include<string> #include<vector> using namespace std; int main(){ int n=0; cin>>n; vector<string> arr(n); for(int i=0;i<n;i++){ getline(cin,arr[i]); } for(int i=0;i<n;i++){ cout<<i<<arr[i]<<endl; } return 0; }
輸入如下:
10 aaaaaaaaaa
到輸完a這行按完換行,輸入就結束了。
輸出結果是0~9個數字各一行的10行。
我一點都不理解運行結果,結果是所有的arr的string成員,都是空。雖然有解釋如下:
一個有用的string IO操作:getline。這個函數接受兩個參數:一個輸入流對象和一個string對象。
getline函數從輸入流的下一行讀取,並保存讀取的內容到 string中,但不包括換行符。
和輸入操作符不一樣的是,getline並不忽略行開頭的換行符。只要getline遇到換行符,即便它是輸入的第一個 字符,getline也將停止讀入並返回。如果第一個字符就是換行符,則string參數將被置為空string。
就算i等於0的時候getline讀了輸完n緩存區的換行,后面的幾個i時,也應該把輸入的值存進后面的string里吧!!!=_=然而並沒有。
Google和百度都給不了解釋。
我覺得可能是cin對象的問題。但是目前還不想去了解,所以只能擱置。當然為了正常運行,解決辦法還是有的。就是先清空cin。
#include<iostream> #include<string> #include<vector> using namespace std; int main(){ int n=0; cin>>n; vector<string> arr(n); cin.ignore(1024, '\n'); //加入這個 for(int i=0;i<n;i++){ getline(cin,arr[i]); } for(int i=0;i<n;i++){ cout<<i<<arr[i]<<endl; } return 0; }
然后就可以按照我的計划執行了。
是加cin.ignore(),而不是cin.clear()。。
待續……