Einlesen von String mit getline() wird übersprungen :S



  • Guten Tag!

    Bei folgendem Programmauszug habe ich das Problem, dass das erste Einlesen des Strings übersprungen wird.
    Der Anwender hat also keine Möglichkeit den String für "NAME" einzugeben, sondern wird gleich aufgefordert den String für "BESITZER" einzugeben. Die Ausgabe lautet:

    Wieviele Patienten wollen Sie eingeben?
    
    Geben Sie den Namen ein!     //hier folgt keine Eingabemöglichkeit
    Geben Sie den Besitzer ein!
    [e]rarr[/e]
    

    Kann mir jemand einen Schubbs in die richtige Richtung geben, damit ich die Problematik erkenne und dann recherchieren kann?

    Sicher könnte ich das Programm einfach anders aufbauen, ich möchte aber gerne wissen, warum es tut was es tut. Vielen Dank für alle Antworten!

    #include "stdafx.h"
    #include <iostream>
    #include "string"
    using namespace std;
    
    struct Patient{
    	string Name;
    	string Besitzer;
    	string Art;
    	string Diagnose;
    	int Alter;
    
    };struct Patient Alle[3];
    
    char patienteneingabe()
    {
    	cout<<"Wieviele PAtienten wollen Sie eingeben?";
    	int anzahl;
    	cin>>anzahl;
    
    	for (int i=0;i<anzahl;i++)
    	{	
    		cout<<endl<<"Geben Sie den Namen ein!!!!"<<endl;
    		getline(cin, Alle[i].Name);
    
    		cout<<"Geben Sie den Besitzer ein!!!!"<<endl;
    		getline(cin, Alle[i].Besitzer);
    
    		cout<<"Geben Sie die Art ein!!!!"<<endl;
    		getline(cin, Alle[i].Art);
    
    		cout<<"Diagnose??"<<endl;
    		getline(cin, Alle[i].Diagnose);
    
    		cout<<"Geben Sie das Alter ein!!!!"<<endl;
    		cin >> Alle[i].Alter;		
    	}
    	return 0;
    }
    
    int main()
    {
    		patienteneingabe();	
    }
    


  • Probiers mit

    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    nach cin>>anzahl; und cin >> Alle[i].Alter; .



  • Oder du mischt 'cin >> ...' und 'getline(...)' nicht. 'getline' kann man eigentlich für alles verwenden.



  • Danke merkotzi.
    So funktioniert es tatsächlich. Ich werde die Funktionsweise, die dahinter steckt mal nachlesen.

    DankeThuruk
    Ich muss mir wohl nochmal n bissel was über diese Funktion durchlesen, bin grad etwas verwirrt, weil ich ein ähnliches problem bekomme, wenn ich das Einlesen mit cin>> mache. Dann folgt ab dem zweiten Durchlauf garkein Einlesen mehr.

    mfG



  • Du solltest eine Struktur 'Alle[anzahl]' nach der Eingabe der Anzahl erstellen. So können maximal 3 Patienten eingegeben werden. Beim 4. schreibst du im schlimmsten Fall über irgendwas anderes im Arbeitsspeicher.^^

    Also aus Zeile 16 entfernen und in Zeile 23 erstellen. 🙂



  • aber als arraygröße muss man doch eine konstante verwenden?



  • sharkoozie schrieb:

    So funktioniert es tatsächlich. Ich werde die Funktionsweise, die dahinter steckt mal nachlesen.

    Nachdem du einen int (anzahl) eingelesen hast, ist das nächste Zeichen im Eingabestrom '\n', sodass dir der erste getline-Aufruf einen leeren String zurückgibt. Du kannst das Problem auch lösen, indem du nur ein einzelnes Zeichen ignorierst.

    Thuruk schrieb:

    Du solltest eine Struktur 'Alle[anzahl]' nach der Eingabe der Anzahl erstellen. So können maximal 3 Patienten eingegeben werden. Beim 4. schreibst du im schlimmsten Fall über irgendwas anderes im Arbeitsspeicher.^^

    Man sollte überhaupt keine rohen Arrays verwenden. Hier wäre std::vector<Patient> angebracht.



  • sharkoozie schrieb:

    aber als arraygröße muss man doch eine konstante verwenden?

    Du kannst zuerst einen Zeiger *Alle definieren, und dann mittels 'Alle=new Patient[anzahl]' das Array erzeugen. So zum Beispiel (mit getline):

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    struct Patient{
    	string Name;
    	string Besitzer;
    	string Art;
    	string Diagnose;
    	short Alter;
    
    };
    
    class Patientenliste{
    private:
    	Patient *Liste;
    	short anzahl;
    public:
    	Patientenliste()
    	{
    		string atoi_str;
    		cout<<"Wieviele Patienten wollen Sie eingeben? ";
    		getline(cin, atoi_str);
    		anzahl=atoi(atoi_str.c_str());
    
    		Liste=new Patient[anzahl];
    
    		for(short i=0;i<anzahl;++i)
    		{   
    			cout << "Geben Sie den Namen ein: ";
    			getline(cin, Liste[i].Name);
    
    			cout << "Geben Sie den Besitzer ein: ";
    			getline(cin, Liste[i].Besitzer);
    
    			cout << "Geben Sie die Art ein: ";
    			getline(cin, Liste[i].Art);
    
    			cout << "Diagnose: ";
    			getline(cin, Liste[i].Diagnose);
    
    			cout << "Geben Sie das Alter ein: ";
    			getline(cin, atoi_str);
    			Liste[i].Alter=atoi(atoi_str.c_str());
    		}
    
    	}
    
    	~Patientenliste(void){
    		delete []Liste;
    	}
    
    	void Ausgabe(void)
    	{
    		for(short i=0;i<anzahl;++i)
    		{
    			cout << "Name: " << Liste[i].Name << ", Besitzer: " << Liste[i].Besitzer << ", Art: " << Liste[i].Art << ", Diagnose: " << Liste[i].Diagnose << ", Alter: " << Liste[i].Alter << '\n';
    		}
    	}
    };
    
    int main()
    {
    	Patientenliste Neu;
    	Neu.Ausgabe();
    
    	return 0;
    }
    


  • Thuruk schrieb:

    Du kannst zuerst einen Zeiger *Alle definieren, und dann mittels 'Alle=new Patient[anzahl]' das Array erzeugen.

    und warum keinen std::vector? macht dasselbe, nur ohne "new"...



  • Kann er ja auch machen, ich hab nichts dagegen gesagt. 😉


Anmelden zum Antworten