2017-11-17 14 views
1

最初にctrl + dで終了した後、プログラムは "cin >> contBuscado"をスキップして をスキップし、forに進みます。 なぜこれが起こっているのか分かりません。私は.ignoreと.clearを使用しましたが、何も起こりません。getline()をスキップする実行

#include <iostream> 
#include<vector> 
using namespace std; 

struct Contacto{ 
string nombre; 
int numero; 
}contacto; 

int main() { 

vector<Contacto> listaContactos; 

while(cout<<"Nombre:" && getline(cin,contacto.nombre)){ 
    cout<<"Telefono:"; 
    cin>>contacto.numero; 
    cin.ignore(); 
    listaContactos.push_back(contacto); 
} 
cin.clear(); 

cout << "\nIntroduce el nombre del contacto a buscar: "; 
string contBuscado=""; 
cin >> contBuscado; 
cin.ignore(); 

for(Contacto const& con:listaContactos){ 
    if(con.nombre==contBuscado){ 
     cout<<"El telefono de "<<contBuscado<<" es "<<con.numero<<"\n"; 
     return 0; 
    } 
} 
cout<<"\nEl contacto introducido no se encuentra en la lista\n"; 

return 0; 

}

+1

'std :: istream :: ignore()'が行うことを、デフォルトのパラメータとともに、そのドキュメントに従って注意深く読んでください。もっと良い方法は、 '' ''と '' ignore() 'を取り除き、' std :: getline'を排他的に使うことです。これは 'std :: getline()'の目的です:改行で終わる入力行を読み込みます。これは '' ''のためのものではありません。 '' ''、 '' ignore''、 '' clear''などの組み合わせを使って '' std :: getline() 'が自然に行うことを達成しようとすると、片頭痛のレシピです。単に 'std :: getline()'を使用してください。ずっと簡単です。少ない驚き。 –

答えて

0

はCtrlDで入力を終了した後、あなたはあなたのプログラムの標準入力を終了しました。この時点では、これ以上の入力はできません。

空白行を入力するなどして、ユーザーがwhileループを終了する方法を追加する必要があります。

さらに、cin >>ではなく、std::getline()を使用する方がずっと簡単です。 cin >>の使用は、その動作が混乱する可能性があるため、対話型入力にはお勧めできません。

+0

これは基本的にこれでした。 Ctrl + Dはmac/XCodeのすべての入力を終了し、Windowsでは現在の入力を終了して次の(cin、getlineなど)に進みます。 @ greg-hewgillありがとうございました。 – CarlosT

関連する問題