C++ Vector auf String Pointer
-
Na ja, es sollte schon in etwa gleichwertig sein. (Aber ob es jetzt std::string oder std::vector ist dürfte wohl egal sein.)
-
Hallo...
Beim folgenden Code funktioniert eigendlich so weit alles. Wenn ich bei Zeile 11 statt "getline(cin, *i)" "cin >> *i" verwende, funktioniert alles normal. Mit getline(cin, *i) jedoch erscheint bei der Ausführung folgendes:
Anzahl Strings: 4
1: 2:Da wird die Eingabe für die eins einfach übersprungen? Wiso?
Bitte um Hilfe!int main() { unsigned n; cout << "Anzahl Strings: "; cin >> n; vector<string> strings(n); int a=1; for(vector<string>::iterator i=strings.begin(); i != strings.end(); ++i){ cout << a << ": "; getline(cin, *i); ++a; } return(0); }
-
Wenn du die Anzahl mit "cin >> n;" einliest, bleibt ein '\n' im Puffer. getline() ignoriert führende Whitespaces aber nicht, sodass der erste String sofort eingelesen wird und nur aus '\n' besteht. Du könntest das z.B. lösen, indem du ein cin.ignore(numeric_limits<streamsize>::max(), '\n') dazwischen packtst. Das ignoriert eine Zeile.
-
@cooky451
Danke. Das habe ich mir eben auch gedacht, danach habe ich versucht das so zu lösen:cout << a << ": " << endl; getline(cin, *i);Weil ich denke, das der endl den Puffer leert, jedoch funktionierte es so auch nicht...
Naja gut, danke für deine Mühe !
-
cout und cin sind doch auch ganz andere Streams, warum sollte ein endl auf cout einen Effekt auf cin haben?

-
cooky451 schrieb:
cout und cin sind doch auch ganz andere Streams, warum sollte ein endl auf cout einen Effekt auf cin haben?

Da habe ich einen Denkfehler gehabt, hast recht

getline(cin.ignore(numeric_limits<streamsize>::max(), '\n'), *i);
Das löst jezt das vorherige Problem, jedoch muss ich ab der zweiten Eingabe zweimal Enter betätigen...
Anzahl Strings: 4
1: String eins
2: String zwei3: Strin drei
4: String vier
Jezt ignoriert er dies... aber gut das ist mal nicht so schlimm, das ganze war ja nur eine Übung. Ich denke solche Themen werden noch im Verlauf des Buches mehr oder weniger behandelt.

-
So sollte eigentlich alles laufen, hast du das ignore in die Schleife gepackt?
int main() { using namespace std; cout << "Anzahl Strings: "; unsigned n; cin >> n; cin.ignore(numeric_limits<streamsize>::max(), '\n'); vector<string> strings(n); for (unsigned i = 0; i != strings.size(); ++i) { cout << i + 1 << ": "; getline(cin, strings[i]); } }
-
cooky451 schrieb:
So sollte eigentlich alles laufen, hast du das ignore in die Schleife gepackt?
Ja, bin aber nach dem Post drauf gekommen... ^^ sry!
Diese ignore() Methode kam bisher leider im Buch noch nicht vor.
-
cvec schrieb:
Diese ignore() Methode kam bisher leider im Buch noch nicht vor.
Ja, gewöhne dich daran, dass ein Buch dir die Sprache und nicht die gesamte Standardbibliothek erklärt.

Falls du wissen willst was es noch alles so gibt, guck in einer Referenz:
C++98: http://www.cplusplus.com/reference/
C++11: http://en.cppreference.com/w/cpp
-
Wow! Hab da jezt mal ein wenig rum gestöbert. Das gibt es ja enorm viel o_O aber das ist wichtig zu wissen. Super. Gibt es vieliecht noch ähnliche Seiten in deutsch? Wobei das nicht zwingend ist...