2017-04-09 142 views
0

我已經寫一個程序,當輸入鍵是下面當用戶進入停止「輸入」鍵

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

int main() 
{ 
    vector<string> a,c; 
    string b; 
    int m=0;//,words = 0; 
    do 
    { 
     cin>>a[m]; 
     m++; 
    } 
    while(cin.get()!= '\n'); 

    int n=0; 
    do 
    { 
     cin>>c[n]; 
     n++; 
    } 
    while(cin.get() != '\n'); 

    int mida=a.size()/2, midc=c.size()/2; 
    int count; 
    int i,j; 

    for(i=0;i<n;i++) 
     for(j=0;j<m;j++) 
      { 
       if(a[i] == c[j]) 
       count++; 
      } 

    if(count >= mida || count >= midc) 
     cout<<"similar"<<endl; 
    else 
     cout<<"dissimilar"<<endl; 
    return 0; 
} 
hit.The代碼給出從在兩個不同的「載體」的用戶和回採取得輸入

現在的問題是,當我輸入單詞後我運行代碼時,我需要把像'mango''orange'這樣的單詞放在空格中,然而 只要我點擊回車就會出現分段錯誤。誰能告訴我什麼可能會出錯。

回答

1

當你創建一個std::vector對象,它開始了,其size將爲零,並在所有的索引會出界,導致未定義行爲(和可能的崩潰)。

您可以使用push_back將元素附加到向量。像

std::string s; 
std::cin >> s; 
a.push_back(s); 

雖然上面是你遇到崩潰的最可能的原因,這不是你的唯一的問題。另一個是每個輸入字符串都可能以換行符結束。如果你想讀一整行,然後將它分成「單詞」,那麼我建議你用std::getline來閱讀整行,然後用std::istringstream來從行中得到單獨的單詞。

您還可以使用std::istream_iterator輕鬆地將append字符串從輸入流轉換爲矢量。

你可以做類似

std::string line; 
std::getline(std::cin, line); 
std::istringstream iss(line); 

a = std::vector<std::string>(std::istream_iterator<std::string>(iss), 
       std::string>(std::istream_iterator<std::string>()); 
0

cin>>a[m];

您索引過去矢量a結束。由於矢量沒有被賦予大小,因此即使分配了a[0]也沒有空間。

可能的解決辦法是使用臨時變量來獲取用戶輸入,然後a.push_back[input]

+0

嘗試(不)。同上 –