2012-04-17 15 views
4

で入力をスキップしている -cin.getline()私は、次のコードを使用している場合は、getlineのは、(「for」ループの最後の反復のために、それは単にそれをスキップします)最後の入力を取ることはありませんC++

int main() 
{ 
    int n; 
    map<string, set<string> > lst; 
    string c,s,c2; 

    cin>>n; 

    for(int i=0;i<n;i++) 
    { 
      getline(cin,c); // here it skips the input for last iteration 
      stringstream ss; 
      ss<<c; 

      bool f=1; 
      while(ss>>s) 
      { 
         if(f) 
         { 
          c2=s; 
          f=0; 
         } 
         else 
          lst[c2].insert(s);   
      } 
    } 

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci) 
    { 
       cout<< (*ci).first <<" "<< (*ci).second.size() <<endl; 
    } 
} 

これを取り除くには、getlineの後にcin.ignore()を追加します。今、そのすべての入力を取って、私は新しい問題に直面している -

#include<iostream> 
#include<string> 
#include<map> 
#include<set> 
#include<sstream> 
#include<algorithm> 

using namespace std; 

int main() 
{ 
    int n; 
    map<string, set<string> > lst; 
    string c,s,c2; 

    cin>>n; 

    for(int i=0;i<n;i++) 
    { 
      getline(cin,c); 
      cin.ignore(); 
      stringstream ss; 
      ss<<c; 

      bool f=1; 
      while(ss>>s) 
      { 
         if(f) 
         { 
          c2=s; 
          f=0; 
         } 
         else 
          lst[c2].insert(s);   
      } 
    } 

    for (map<string, set<string> >::const_iterator ci = lst.begin(); ci != lst.end(); ++ci) 
    { 
       cout<< (*ci).first <<" "<< (*ci).second.size() <<endl; 
    } 
} 

新しい問題がc2をしながら、文字列の最初の文字が削除されるということです。例えば、私がgetlineへの入力として "England Jane Doe"を与えると、c2で "ngland"を得るでしょう。

この問題を解決するにはどうすればよいですか?

+3

'' 'と' 'getline'を混在させることは繊細です。どちらの場合でも、結果を決してチェックしないので、なぜあなたのコードが動作すると期待していますか? –

+1

'(* CI)は[CIN後のgetline(CIN、複数可)を使用して]のCI-> first' –

+0

可能重複('のように読みやすく.first' http://stackoverflow.com/questions/5739937/using-getlinecin -s-after-cin) – alexisdm

答えて

10

この:

cin>>n; 

は数だけを読んでいます。
ストリームの末尾に'\n'が残されます。

だから、getline()にあなたの最初の呼び出しは、それは、operator>>std::getline()の使用を混在しないように最善であるだけで'\n'

を含む空行を読んでいます。ストリームに改行を残したかどうかは非常に注意する必要があります。ユーザーから常に一度に1行ずつ読むのが最も簡単です。次に、行を別々に解析します。

std::string numnber; 
std::getline(std::cin, number); 

int n; 
std::stringstream numberline(number); 
numberline >> n; 
+0

素敵な説明をありがとう! :) – theharshest

1

cin.ignore()が間違った場所にあります。 getlineは末尾に\n改行文字を残しません。これはそれを行う>>シンボルです。あなたはおそらく欲しい

cin>>n; 
cin.ignore(); 
+1

'cin.ignore'は1文字だけを無視するので、' \ n'改行文字まですべての文字を無視する必要があります。 – alexisdm

0

は自分の最後の ">>" 演算子の後

cin.ignore(); 

を書きです。 ">>"演算子は、入力を取り込む前にクリアする必要がある入力ビットストリームに改行 "\ n"を残します。

0

が実際にCINバッファは、\ nは最後のCINから残った、 はそうgetlineのこの\ n個の文字を取って終了します。 )(のgetline ...

cin.ignore前にバッファの内容を無視します。

getling(cin、string_name);

//スムーズに動作します

関連する問題

 関連する問題