problem mit for-Schleife nach dem ersten Durchlauf



  • Hallo leute!
    Nachdem das Programm den ersten Schleifendruchlauf beendet hat, lässt sich der Name nicht mehr eingeben. Kannte sowas bissher bei Java mit dem Input, da hat er irgendwie das Return mit in die nächste Zeile genommen... danke für eure Hilfe 🙂 (siehe main)

    [cli]
    #include <iostream>
    #include <cstdlib>
    using namespace std;

    class person
    {
    public:
    person();
    person(int age, string na, char sex);
    void getInfo();
    void setInfo(int age, string na, char sex);
    private:
    int alter;
    char geschlecht;
    string name;

    };

    person::person()
    {
    alter=0;
    geschlecht='m';
    name="Max Mustermann";
    }

    person::person(int age, string na, char sex)
    {
    alter=age;
    geschlecht=sex;
    name=na;
    }

    void person::getInfo()
    {
    cout << "Name: "<< name << endl;
    cout << "Alter: "<< alter << endl;
    cout << "Geschlecht: "<< geschlecht << endl;
    }

    void person::setInfo(int age, string na, char sex)
    {
    alter=age;
    name=na;
    geschlecht=sex;
    }

    int main()
    {
    person personen[5];
    char c;
    string s1="";
    int a=0;
    for(int i=0; i<5; i++)
    {
    cout << "Bitte geben Sie den Namen der Person " << i << " ein: ";
    getline(cin, s1);
    cout << "Bitte geben Sie das Geschlecht der Person " << i << " ein: ";
    cin >> c;
    cout << "Bitte geben Sie das Alter der Person " << i << " ein: ";
    cin >> a;
    personen[i].setInfo(a, s1, c);
    cout << endl;
    }

    for(int i=0; i<5; i++)
    {
    personen[i].getInfo();
    }

    return 0;
    }
    [cli]


  • Mod

    Kannte sowas bissher bei Java mit dem Input, da hat er irgendwie das Return mit in die nächste Zeile genommen

    Ja, das ist hier auch das Problem. Das kommt von der Mischung von istream::operator>> und getline, welche unterschiedlich funktionieren. Eine Möglichkeit wäre hier ein cin.ignore(1000,'\n') nach dem cin>>a; (oder wenn du es schicker haben möchtest numeric_limits<streamsize>::max() statt der willkürlichen 1000, benötigt den limits-Header). Allgemein musst du zusehen, dass nach den formatierten Einleseoperationen wie Operator>> nachfolgender Whitespace wie das Return-Zeichen noch im Stream sind. Dies kann dann darauf folgende unformatierte Einleseoperationen wie getline etwas anderes machen lassen als man erwartet.



  • Astrein! Danke jetzt funzt es 🙂 Schöne schnelle Antwort, werde sicher noch ein einige Fragen hier posten 😉


Anmelden zum Antworten