Verschieden große Strings ausgeben
-
Ja, den Fehler habe ich schon behoben.
Ich sollte wirklich zuvor nachdenken, bevor ich was poste.
Sorry...
-
switch(number) { case 1: for (i=0; i<=1; i++) { cout << "Geben Sie nun einen Text ein!" << endl; cin >> Text[i]; } cout << "Diesen Text haben Sie eingegeben:" << endl; for (i=0; i<=1; i++) { cout << Text[i]; } break; }Willst du dann für jede mögliche Antwort einen case und eine eigene for-Schleife bilden? Lass den Benutzer lieber eingeben, wieviele Texte er eingeben will und benutze diesen Wert dann in deiner for-Schleife.
Btw, deine Schleife macht 2 Eingaben, nicht eine (für i=0 und i=1, da du auf <=1 statt <1 prüfst).
-
Ja, ich habe 7 verschiedene Case Zweige
1
5
10
25
50
75
und 100Hm ... ich überlege einmal, wie man das optimieren kann...
Wenn Du Tipps hast, dann nur her damit...
Gruß
Max
-
Benutzer, wieviele Texte möchtest du eingeben?
Antwort: ich möchte
anzahlTexteTexte eingeben.for(int i=0;i<anzahlTexte;++i) { //eingabe }So musst du nicht mehr Antwort 3 zu "Eingabe von 10 Texten" übersetzen und kannst dir das switch-Statement sparen. Außerdem ist die Anzahl dann wirklich beliebig und nicht begrenzt auf die paar Möglichkeiten, die du dem Benutzer vorgibst.
-
Ich habe jetzt folgenden Code aufgesetzt:
#include <iostream> #include <string> using namespace std; int main() { int i; int Anzahl_Texte; std::string Text; cout << "Wie viele Texte wollen Sie eingeben?" << endl; cin >> Anzahl_Texte; for(i=0; i<Anzahl_Texte; i++) { cout << "Geben Sie nun Ihren Text ein!" << endl; cin >> Text; } cout << "Das haben Sie eingegeben: " << endl; for(i=0; i<Anzahl_Texte; i++) { cout << Text; } return 0; }Wie kann ich denn die Kontrollausgabe so beeinflussen, damit mir nicht nur der Text im 5ten Durchlauf angezeigt wird?
Wenn ich zum Beispiel
Hallo
mein
Name
ist
Maximilianeingebe, dann wird mir fünfmal Maximilian angezeigt, bloß ich will den ganzen Text angezeigt bekommen. Bloß wie geht das?
Gruß Max
-
du überschreibst ja auch immer den inhalt vom string mit jedem durchlauf der schleife. was du brauchst ist ein container, in dem du deine texte speichern kannst. std::vector wäre hier zum beispiel geeignet.
oder aber, du hängst jede eingabe am ende deines strings an.
wie du das alles machst, erklärt dir deine c++ refernz deiner wahl.
-
#include <iostream> #include <string> using namespace std; int main() { int i; int Anzahl_Texte; std::string Text; cout << "Wie viele Texte wollen Sie eingeben?" << endl; cin >> Anzahl_Texte; for(i=0; i<Anzahl_Texte; i++) { cout << "Geben Sie nun Ihren Text ein!" << endl; cin >> Text; cout << Text; } cout << "Das haben Sie eingegeben: " << endl; for(i=0; i<Anzahl_Texte; i++) { } return 0; }
-
Zuerst hast du ein Array mit mehreren Strings angelegt. Grundsätzlich richtig. Jetzt nimmst du aber immer nur einen String und schreibst in jedem Schleifendurchlauf da rein, das heißt du überschreibst jedesmal das vorherige Ergebnis. Grundsätzlich falsch.

Mach doch erst mal wieder ein Array mit 100 Elementen. Darauf wendest du dann deinen Schleifenindex an, bei Ein- und Ausgabe.
std::string MeinArray[100]; //ein Array! cin >> MeinArray[0]; //Zugriff auf das erste Element (0) des Arrays cout << MeinArray[50]; //Zugriff aus das 51. Element (50) des ArraysDein Code kracht dann zwar, wenn der Benutzer mehr Elemente eingeben will, als dein Array hat, aber hauptsache du kommst erst mal weiter. Und dann unterhalten wir uns mal über std::vector.
-
Mit container oder vector kann ich mich erst befassen, wenn ich mein Buch habe. Morgen kann ich es abholen.
Hm...
Mal gucken, wie das in der Reference geschrieben ist.
-
Also muss ich ja doch irgendwie die Eingabe der Texte vorher festlegen? Zumindest muss ich ja den Array festlegen...
Zumindest funktioniert jetzt folgender Code:
#include <iostream> #include <string> using namespace std; int main() { int i; int Anzahl_Texte; std::string Text[100]; cout << "Sie können zwischen einen und 100 Texte eingeben!" << endl; cout << "Wie viele Texte wollen Sie eingeben?" << endl; cin >> Anzahl_Texte; for(i=0; i<Anzahl_Texte; i++) { cout << "Geben Sie nun Ihren Text ein!" << endl; cin >> Text[i]; } cout << "Das haben Sie eingegeben: " << endl; for(i=0; i<Anzahl_Texte; i++) { cout << Text[i] << endl; } return 0; }Edit:
Mit Vectoren möchte ich erst arbeiten, wenn ich das Buch "Der C++ Programmierer" habe. Nichts gegen Dich _matze, aber ich glaube, es wäre didaktisch besser, wenn ich erst mich ersteinmal damit beschäftige, um was es bei Vectoren geht, bevor ich total blind in ein Thema schieße...
Andererseits... wenn Du bereit bist, das mit Vectoren gescheit zu erklären, dann kannst Du es gern posten, ich möchte Dich nicht aufhalten.
Gruß
Max
-
Ein vector ist ein Container, der beliebig viele Elemente aufnehmen kann (anstatt eines Arrays, bei dem schon zur Compilezeit festgelegt wird, wieviele Elemente es maximal aufnehmen kann).
Einziger Unterschied zu deinem bisherigen Code wäre, daß du den vector erst nach der Eingabe von Anzahl_Texte erzeugen würdest:
cin >> Anzahl_Texte; std::vector<std::string> Text(Anzahl_Texte);(#include <vector> aber nicht vergessen)
P.S. Lokale Variablen solltest du besser in lowercase schreiben und die Einzahl/Mehrzahl beachten, d.h.
cin >> anzahl_texte; std::vector<std::string> texte(anzahl_texte);
-
silent_max schrieb:
std::string Text[100];Edit:
Mit Vectoren möchte ich erst arbeiten, wenn ich das Buch "Der C++ Programmierer" habe.string[100] ist doch Käse! Du verschwendest Speicher damit, wenn der Benutzer nur 5 Zeilen eingeben will. Wenn der Benutzer mehr als 100 Zeilen eingeben will, reicht es nicht. Genau so entstehen Pufferüberläufe! Mit std::vector wär das jetzt sooooo einfach!
Merkst du was?
Man hat dir std::string gegenüber char[] empfohlen.
Man hat dir vector<string> gegenüber string[100] empfohlen.Aus vielen guten Gründen!
char[N] und string[M] sind rohe Arrays. Du musst die Größe vorher (zur Compile-Zeit!) festlegen. Rohe Arrays sind dumme Aneinanderreihungen. Indizierungsfehler lassen sich nur schwer abfangen.
std::vector und std::string sind "dynamische Felder". Das heißt, die Größe lässt sich zur Laufzeit festlegen (und sogar ändern). std::string ist so etwas ähnliches wie std::vector<char> mit ein paar extra String-Operationen. Es handelt sich hier um Typen aus der Standardbibliothek. In den meisten Fällen, bietet einem die Standardbibliotheksimplementierung einen Debug-Modus an. Das ist prima, denn damit kann man Fehler, wie z.B. einen ungültigen Index, früh erkennen und abfangen.
Ich will nicht sagen, dass rohe Arrays keinen Platz in C++ haben. Alles hat mehr oder weniger einen Sinn in C++. Der Sprachkern bietet aber viele low-level Features, die man besser höchstens nur indirekt nutzt. Wenn du wirklich ein Feld von Ts mit statischer Länge 23 brauchen solltest, dann nimmst du std::array<T,23> und nicht T[23]. Indirekt verwendest du dann auch ein T[23], aber der Vorteil ist einfach, dass std::array<T,23> sich "regulär" bzgl Parameterübergabe und Funktionsrückgabe verhält und du immernoch in den Genuss eines Debug-Modus kommst, der bei Elementzugriffen z.b. noch überprüft, ob das Element überhaupt existiert oder der Index außerhalb des zulässigen Bereichs ist. std::array bietet auch eine bessere STL-Integration (Iteratoren und co).
Meiner Meinung nach ganz wichtig am Anfang:
- sich nicht mit Low-Level Gedöns aufhalten
- sich mit dem Compiler vertraut machen (Doku lesen! Debug-Modi nachschlagen!)silent_max schrieb:
aber ich glaube, es wäre didaktisch besser, wenn ich erst mich ersteinmal damit beschäftige, um was es bei Vectoren geht,
Dann tu das bitte.
So einfach kann das sein:
#include <algorithm> #include <iostream> #include <string> #include <vector> void text_anzeigen(std::vector<std::string> const& text) { using namespace std; int anzahl = text.size(); // ein vector kennt seine Größe for (int i=0; i<anzahl; ++i) { cout << text[i] << endl; } } int main() { using namespace std; cout << "Bitte Text eingeben, beenden mit Doppelminus (--):" << endl; vector<string> eingaben; // ein zunächst leerer vector string zeile; while (getline(cin,zeile)) { if (zeile == "--") break; eingaben.push_back(zeile); // zeile hinten anfügen } cout << "Ihr eingegebener Text war:" << endl; text_anzeigen(eingaben); cout << "\nWenn ich die Zeilen lexikographisch sortiere, " "sieht das so aus:" << endl; sort(eingaben.begin(),eingaben.end()); text_anzeigen(eingaben); }
-
So weit wie Du bin ich noch lange nicht.... wie geschrieben habe ich erst heute mein Buch ("Der C++ Programmierer") bekommen.
Leider bin ich noch nicht so weit, um mit Dir auf Augenhöhe zu sein.
Gruß