Wie einen input in dynamisch erstelltes Array aus structs schreiben?



  • Hallo

    Ich fange gerade mit C++ an und habe ein Problem mit einer Übungsaufgabe:
    Ich muss mit "new" ein Array von structs erstellen, der name des struct-typs ist
    "cars" und dann per for-loop einen input von der konsole in ein char-member
    von jeder cars-struct einlesen. Hier der Code-Ausschnitt:

    #include <iostream>

    using namespace std;

    int main()
    {
    int number;
    struct cars
    {
    char make[20];
    int year;
    };
    cout << "How many cars do you wish to catalog?: ";
    cin >> number;
    cars * pcars = new cars[number]; //Array aus cars-structs wird erstellt
    for (int i = 0; i < number; i++)
    {
    cout << "Car #" << (i + 1) << endl;
    cout << "Please enter the make: ";
    cin.getline(cars[i] -> make, 20); //hier ist ein error
    cout << "Please enter the year built: ";
    cin >> cars[i] -> year; //und hier auch
    }
    cout << "Here's your list:\n";
    for (int i = 0; i < number; i++)
    {
    cout << cars[i] -> year << ", "; //hier natürlich
    cout << cars[i] -> make << endl; //ebenfalls
    }
    cin >> number;
    return 0;
    }

    Ich weiss nicht, wie ich den input in die dynamisch erstellten arrays kriege..
    und wieder raus 🙂
    wäre echt dankbar für hilfe.



  • cin>>cars[i].make;

    Rest analog.



  • Sry, meine natürlich pcars statt cars.



  • Shinja (ausgeloggt) schrieb:

    cin>>cars[i].make;

    Rest analog.

    Hab ich versucht, klappt nicht...
    der compiler gibt folgenden error aus:
    "requested primary expression before "["-token."

    und müsste man nicht sowieso die members via pointer verändern, also
    so was wie z.B. (*pcars[i]).make ????
    ps: genau so hab ichs zwar auch schon versucht, selber error...



  • Jawollja, pcars[i].make, das wars. danke vielmals!!!!!
    aber geht das auch mit cin.getline(pcars[i].make) ? damit man
    mehr als ein wort reinspeichern kann...?



  • for (int i=0;i<number;i++)
    {
      cout << "Car #" << (i+1) << endl;
      cout << "Please enter the make: ";
      cin.ignore(); //um \n aus dem Buffer zu bekommen
      cin.getline(pcars[i].make, 20,'\n');
      cout << "Please enter the year built: ";
      cin >> pcars[i].year;
    }
    


  • Ja hast recht, das funktioniert.
    aber ich habe diese funktion ignore() noch nie
    gesehen....was macht die genau, und warum muss man
    dann noch einen newline escape sequence als argument an
    cin.getline() übergegen?

    einfacher ist es nicht möglich?



  • cin.ignore(x) löscht x (default 1) Zeichen aus dem Eingabepuffer, in dem Fall das \n, das von cin >> number; und cin.getline() übriggelassen wird.
    Und du kannst getline() sagen, bei welchem Zeichen die Eingabe abgebrochen werden soll, also bei \n. Bei dev-cpp ist das auch ohne explizite Angabe \n, deiner Beschreibung nach scheint es bei dir aber ' ' zu sein.
    Ob es einfacher geht, weiss ich nicht, hab mich noch nie wirklich mit den Standard-Streamklassen auseinandergesetzt.



  • Hmm, ich benutze dev-c++, brauche das newline in cin.getline()
    aber definitiv, ohne gibt der compiler einen error aus...

    ok, glaube ich begreife ungefähr was ignore macht, wenn man enter
    drückt geht ja ein newline in den input stream.

    Auf jeden Fall danke vielmals für die hilfe.



  • Noch ein kleiner Nachtrag:
    hab gerade eben Unsinn erzählt, getline() entfernt \n nämlich aus dem Eingabepuffer. cin >> pcars[i].year; macht das jedoch nicht.


Anmelden zum Antworten