string類的getline函數


直接用代碼來說好了。

#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()。。

待續……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM