Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Übung zu vector<std::string>

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
28.05.2022, 00:02 Uhr
Data2006



Moin zusammen,

neben meinem anderen Postings hier noch ein neues.
Ich wollte in C++ nur mal was ausprobieren mit Vektoren (vector<std::string> namen; kannte ich noch nicht).

Ich will eine abzufragende Anzahl von Namen in ein Vector namen schreiben.

Habe dieses ausprobiert:

C++:
#include <iostream>
#include <vector>

int main(void)
{
    int i, anzahl;
    std::vector<std::string> namen;
    std::string name;
    std::cout << "Anzahl: ";
    std::cin >> anzahl;
    
    for(i=1;i<=anzahl;i++)
    {
        std::cout << i << ". Name: ";
        //std::cin >> name;
        getline(std::cin, name);
        std::cout << std::endl;
    }
    
    std::cout << std::endl << "Indexe:" << std::endl;
    for(i=0;i<anzahl;i++)
        std::cout << i << std::endl;
}


Es wird 1. Name: ausgegeben, aber eine Eingabe ist nicht möglich - es wird direkt eine Zeile darunter 2. Name: ausgegeben. Ab dann kann ich eine Eingabe machen.
Woran liegt das? Ich habe das Gefühl es liegt an getline(...) Wenn ich getline... auskommentiere und dafür std::cin >> name; mache, klappt es.
Aber in der Ausgabe sind zuviele Leerzeilen. Da habe ich irgendwo ein std::endl zuviel. Weiß nicht wo.
Aber es geht hier ja erst mal darum das ich die Namen mit Leerzeichen eingeben kann. Leerzeichen mit std::cin >> name; nimmt keine Leerzeichen auf.

Ich wollte in der 1. Schleife noch die name in den vector namen reinschreiben:

C++:
namen.push_back(name);


Und in der 2. Schleife die namen auch wieder ausgeben.
Aber wenn ich vorher schon nicht weiter komme, bringt das dann nix.

Gute Nacht zusammen,
Data2006

PS: Unter C hatte ich mal getchar(c) genommen. Geht das in dem o. g. Programm auch mit getchar(name)?

Dieser Post wurde am 28.05.2022 um 00:03 Uhr von Data2006 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.05.2022, 19:25 Uhr
f.-th.



Folgender Quelltext löst zwar nicht alle deine Fragen, aber zeigt das du schon in der richtigen Richtung unterwegs bist.


C++:
#include <iostream>
#include <vector>

std::string lese_string(int zahl)
{
    std::string name;
    std::cout << zahl << ". Name: ";
    getline(std::cin, name);
    return name;
}
        

void gib_vector_aus(std::vector<std::string> &names)
{
    std::cout << "{\n";
    std::for_each(names.begin(), names.end(), [](std::string v) {std::cout << v << '\n';});
    std::cout << "}" << std::endl;
}

int main(void)
{
    int i, anzahl = 5;
    std::vector<std::string> namen;
    std::string name;
    // std::cout << "Anzahl: ";
    // std::cin >> anzahl;
    //    std::cout << std::endl;

    for(i=0;i<anzahl;i++)
    {
        namen.push_back(lese_string(i));
        std::cout << std::endl;
    }

    gib_vector_aus(namen);
}



Das mit den denglischen Namen/names sollte man noch angehen und ein paar andere Baustellen gibt es.
Die Quelltextformatierung ist quick-paste and copy. Sehe gerade das die Formatierung hier im Forum unterstützt wird - ist also besser als die Vorlage.

MfG
f.-th.

Dieser Post wurde am 28.05.2022 um 19:33 Uhr von f.-th. editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.05.2022, 23:02 Uhr
f.-th.



So noch das getline - Problem etwas entschärfen. Es gibt noch Alternativen zur gezeigten Lösung.

C++:
std::string lese_string(int zahl)
{
    std::string name{};
    std::cout << zahl << ". Name: ";
    std::cin.ignore();                    // use it before getline
    std::getline(std::cin, name);
    return name;
}



Quelle siehe:
hier klicken

MfG
f.-th.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.05.2022, 23:56 Uhr
Data2006



Vielen Dank,

muß gestehen so ganz habe ich das Programm nicht verstanden. Funktion lese_string verstehe ich noch, aber bei Funktion gib_vector_aus kenne ich das

C++:
std::cout << "{\n";
    std::for_each(names.begin(), names.end(), [](std::string v) {std::cout << v << '\n';});


nicht. Also das "{\n"; kenne ich nicht mit dem {
Und std::for_each(names.begin... kenne ich auch nicht.

Ich habe jetzt noch mal eine geänderte Version ausprobiert:

C++:
#include <iostream>
#include <vector>

#define ANZAHL 5

int main()
{
    std::vector<std::string> namen;
    std::string name;
    int i;
    
    for(i=1;i<=ANZAHL;i++)
    {
        std::cout << i << ". Name: ";
        getline(std::cin, name);
        namen.push_back(name);
    }
    
    for(i=0;i<ANZAHL;i++)
        std::cout << std::endl << namen[i];
    
    return 0;
}


Das Programm läuft auch soweit, nur das ich ANZAHL fest auf 5 habe.

Habe Abfrage der Anzahl noch eingebaut. Aber das hier kenne ich auch noch nicht:

C++:
std::cin.ignore();


Wozu ist das gut?

Ich dachte der Fehler läge an getline, aber dann gesehen es lag am std::cin.
Wenn ich die Anzahl einlese, wird dann das Return an getline weitergeleitet? Also ein zusätzliches Zeichen im cin-Eingabepuffer?


Mein Programm sieht jetzt so aus:

C++:
#include <vector>
#include <iostream>

int main()
{
    std::vector<std::string> namen;
    std::string name;
    int i, anzahl;
    
    std::cout << "Anzahl der Namen: ";
    std::cin >> anzahl;
    std::cin.ignore();
    
    for(i=1;i<=anzahl;i++)
    {
        std::cout << i << ". Name: ";
        getline(std::cin, name);
        namen.push_back(name);
    }
    
    for(i=0;i<anzahl;i++)
        std::cout << std::endl << namen[i];
    
    return 0;
}



Mit Variable/Vector name/namen ist mir keine andere Bezeichnung eingefallen. Aber es stimmt, in nem großen Programm kann man name und namen dann schlecht unterscheiden.

Gute Nacht,
Data2006
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.05.2022, 12:05 Uhr
f.-th.



Ich mach ein wenig c++ damit meine grauen Zellen nicht einrosten - ist nicht alles perfekt.


Zitat von Data2006:
Vielen Dank,

muß gestehen so ganz habe ich das Programm nicht verstanden. Funktion lese_string verstehe ich noch, aber bei Funktion gib_vector_aus kenne ich das

C++:
std::cout << "{\n";
    std::for_each(names.begin(), names.end(), [](std::string v) {std::cout << v << '\n';});


nicht. Also das "{\n"; kenne ich nicht mit dem {
Und std::for_each(names.begin... kenne ich auch nicht.

...




C++:
void gib_vector_aus(std::vector<std::string> &names)
{
    std::for_each(names.begin(), names.end(), [](std::string v) {std::cout << v << '\n';});
    std::cout << std::endl;
}



Das sollte die kompakte Funktion mit wenig optischem Kram sein.
In der ersten Zeile wird der Vector mit den Strings mit der frei gewählten Bezeichnung "names" für die Funktion bereit gestellt.
"for-each" = für jedes Element im Bereich von Bezeichnung.begin() bis Bezeichnung.end() lese den String "v" und gib ihn mit "std::cout << v" aus. Der Rest ist noch etwas für die Optik.
"v" ist hier vielleicht etwas unglücklich gewählt - da könnt ihr auch andere Namen wählen.

Es kann sein das etwas ältere Compiler das for_each noch nicht kennen, aber da findet ihr im Netz noch Versionen mit for( int i =0;i<...

Ich hoffe diese kurze Erklärung reicht?

Zum cin.ignore versuche den Link zur Quelle zu lesen.

MfG
f.-th.

Dieser Post wurde am 29.05.2022 um 12:07 Uhr von f.-th. editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.05.2022, 19:51 Uhr
Data2006



Danke schön.

Habe mir die Quelle noch mal angeguckt. Ist zwar alles Englisch, aber ich denke ich habe jetzt die Lösung verstanden.

LG
Data2006
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: