Frage zur Arrayeingabe
-
Hallöchen Forumgemeinde,
schön das ich euch gefunden habe

Also ich mache gerade meine Ausbildung um ITA und C++ ist fester bestandteil dieser. Bisher hatte ich auch nicht wirklcih Probleme damit, doch im Moment krieg ich echt Kopfweh. Ich bin dabei eine Art CD-Liste zu erstellen. Fragt nicht warum, ist Aufgabe des Lehrers

Nun ja, alles klappt prima, bis auf die Eingabe bei den Arrays.
string interpret[1000]; // Ein Array des Typen String mit 1000 Feldern float spieldauer[1000]; // Ein Array des Typen Float mit 1000 Feldern string titel[1000]; // Ein Array des Typen String mit 1000 Feldern // -------------------------------- FUNKTIONEN ----------------------------- // EINGABEFUNKTION void Eingabe() { int cdnr=0; cout << "Bitte geben sie die CD Nummer ein" << endl; cin >> cdnr; // Die Variable cdnr. stellt gleichzeitig den Array-Index dar. cout << " " << endl; cout << "Bitte geben sie den Interpreten ein" << endl; cin >> interpret[cdnr]; // Der eingegebene String wird dem Arrayfeld cdnr. hinzugefügt cout << " " << endl; cout << "Bitte geben sie den Titel ein" << endl; cin >> titel[cdnr]; // Der eingegebene String wird dem Arrayfeld cdnr. hinzugefügt cout << " " << endl; cout << "Bitte geben sie die Spieldauer ein" << endl; cin >> spieldauer[cdnr]; // Der eingegebene Floatwert wird dem Arrayfeld cdnr. hinzugefügt cout << " " << endl; cin.get(); }Hier mal meine definierten Arrays und die Funktion der Eingabe. Wie gesagt klappt das alles schön und gut, doch sobald ich in meinen Interpreten ein Leerzeichen einfüge, lande ich in einer erbärmlichen Endlosschleife. Warum versteh ich nicht und ich finde auch keinen Lösungsansatz.
Vielleicht kann mir hier ja jemand helfen.
Vielen Dank im Voraus!
greetz
Ronny
-
Hi!
std::getline( std::cin, interpret[ cdnr ] );grüße
-
Wow, das ging aber fix und ich sag auch schon 1000x danke, nur habe ich jetzt ein Prob in meiner Suche Funktion, die folgendemassen aufgebaut ist.
// SUCHFUNKTION void Suchen() { sting inter; int i=0; // Variable für das zu vergleichende Arrayfeld cout << "Geben sie den Interpreten der CD ein die sie Suchen wollen!" << endl; cin >> inter; // Eingabe des Arraywertes der gesucht wird while (interpret[i] != inter) { i++; // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt } // wird der Wert i um einen erhöht und es wird wieder kontrolliert // Ist der Wert aus Feld i mit der Eingabe "inter" gleich, // so wird folgendes ausgegeben cout << " " << endl; cout << "CD Nummer: " << i << endl; cout << "Interpret: " << interpret[i] << endl; cout << "Titel: " << titel[i] << endl; cout << "Laenge: " << spieldauer[i] << endl; cin.get();cin.get(); }Beim ersten Versuch das Prog zu starten sagte er mir fehlen bei der definition von string inter. Beim nächsten mal startete das Programm, doch bei meine Eingabe Funktion wird die Eingabe des Interpreten nun völlig übersprungen.
Ich kopier einfach mal den kompletten Quellcode.

#include <iostream.h> #include <string> #include <vcl.h> #include <conio.h> #pragma hdrstop using namespace std; #pragma argsused string interpret[1000]; // Ein Array des Typen String mit 1000 Feldern float spieldauer[1000]; // Ein Array des Typen Float mit 1000 Feldern string titel[1000]; // Ein Array des Typen String mit 1000 Feldern // -------------------------------- FUNKTIONEN ----------------------------- // EINGABEFUNKTION void Eingabe() { int cdnr=0; cout << "Bitte geben sie die CD Nummer ein" << endl; cin >> cdnr; // Die Variable cdnr. stellt gleichzeitig den Array-Index dar. cout << " " << endl; cout << "Bitte geben sie den Interpreten ein" << endl; std::getline( std::cin, interpret[ cdnr ] ); // Der eingegebene String wird dem Arrayfeld cdnr. hinzugefügt cout << " " << endl; cout << "Bitte geben sie den Titel ein" << endl; cin >> titel[cdnr]; // Der eingegebene String wird dem Arrayfeld cdnr. hinzugefügt cout << " " << endl; cout << "Bitte geben sie die Spieldauer ein" << endl; cin >> spieldauer[cdnr]; // Der eingegebene Floatwert wird dem Arrayfeld cdnr. hinzugefügt cout << " " << endl; cin.get(); } // AUSGABEFUNKTION void Ausgabe() { int cdnr=0; cout << "Bitte geben sie eine CD Nummer ein" << endl; cin >> cdnr; // Eingabe des gesuchten Arrayfeldes cout << " " << endl; cout << "CD Nummer: " << cdnr << endl; cout << "Interpret: " << interpret[cdnr] << endl; // Arrayfeld cdnr. wird ausgelesen cout << "Titel: " << titel[cdnr] << endl; // Arrayfeld cdnr. wird ausgelesen cout << "Spieldauer: " << spieldauer[cdnr] << endl; // Arrayfeld cdnr. wird ausgelesen cout << " " << endl; cin.get();cin.get(); } // SUCHFUNKTION void Suchen() { string inter; int i=0; // Variable für das zu vergleichende Arrayfeld cout << "Geben sie den Interpreten der CD ein die sie Suchen wollen!" << endl; cin >> inter; // Eingabe des Arraywertes der gesucht wird while (interpret[i] != inter) { i++; // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt } // wird der Wert i um einen erhöht und es wird wieder kontrolliert // Ist der Wert aus Feld i mit der Eingabe "inter" gleich, // so wird folgendes ausgegeben cout << " " << endl; cout << "CD Nummer: " << i << endl; cout << "Interpret: " << interpret[i] << endl; cout << "Titel: " << titel[i] << endl; cout << "Laenge: " << spieldauer[i] << endl; cin.get();cin.get(); } // ---------------------------- HAUPTPROGRAMM --------------------------------- int main() { int eingabe=0; do { cout << "CD-Verwaltung" << endl; cout << " " << endl; cout << "(1) Eingabe" << endl; cout << "(2) Ausgabe" << endl; cout << "(3) Suchen" << endl; cout << "(4) Sortieren" << endl; cout << " " << endl; cout << "(9) Beenden" << endl; cout << " " << endl; cout << "Bitte treffen sie eine Auswahl: " ; cin >> eingabe; switch(eingabe) { case 1: Eingabe(); clrscr(); break; case 2: Ausgabe(); clrscr(); break; case 3: Suchen(); clrscr(); break; case 4: cout << " " << endl; cout << "Hier wird sortiert!" << endl; cin.get();cin.get(); clrscr(); break; case 9: eingabe=9; break; default: cout << "Bitte Eingabe korregieren" << endl; cin.get();cin.get(); clrscr(); } } while ( eingabe!=9); cin.get(); cin.get(); return 0; }
-
Hi!
Im ersten Codefragment schreibst du sting. Im unteren Code stimmts dann. Du solltest die Eingabe des Interprets auch über getline lösen.
grüße
-
Also das mit dem sting/string befehl hab ich behoben, dennoch überspringt er bei mir immer ncoh die eingabe des interpreten

-
std.:cin.cear(); std::cin.ignore(std::cin.rdbuf()->in_avail());sollten helfen.
-
Also diese Befehlsfolge bewirkt bei mir, das das Programm bei der Suche einen Absturz hat.

-
Hier ist noch:
#include <iostream> // Ohne .h ! #include <string> #include <vcl.h> #include <conio.h> #pragma hdrstop using namespace std; #pragma argsusedWas ist eigenltich conio.h?
Das kenne ich ned... oder pragma??Gg
-
Ja, gibts beides. Is aber Microsoft spezifischer Kram!

grüße
-
Jaja, und die VCL ist auch von MS

-
roko79 schrieb:
Also diese Befehlsfolge bewirkt bei mir, das das Programm bei der Suche einen Absturz hat.

http://www.gnu.org/software/ddd/
Ein sehr guter Debuger.
Setzt auf dem GDB auf. sicher ein versuch wert.
-
Thomas (: schrieb:
Jaja, und die VCL ist auch von MS

MS-DOS spezifische Funktionen in conio.h Programme, die darauf aufbauen, sind nicht portabel, da conio.h nicht zur ANSI-Standardbibliothek gehört und z.B. auf einer Sun oder in Linux nicht verfügbar ist.
MS-Spezifischer gehts ja wohl nich, oder?
grüße
-
Tut mir ja leid mit all den MS Teilen, doch wenn unsere Lehrer uns das so zeigt

Aber um auf mein Prob zurückzukommen, das sieht immer noch so aus, das ich bei der Suche ein riesiges Prob hab.
Ich kann nun problemlos texte mir lehrzeichen eingeben und auch wieder ausgeben, doch mit der suche das läuft alles schief. ich glaub ich geb es auf und muss damit leben das ich nur ein wort eingeben kann
-
Was läuft denn schief?
-
ich kriege folgende fehlerbox und das prog ist tot.
-
Dann schmeiß mal den Debugger an. Diese Fehlermeldung kann nur eine vage Vermutung auf das tatsächliche Problem geben.
grüße
-
Hier noch mal etwas mehr info
http://pixelfummler.redio.de/2.jpg
http://pixelfummler.redio.de/2.gif
-
Das bringt nich wirklich viel. Es wäre viel interessanter bei welcher Aktion das Programm abstürzt. Um sowas rauszufinden kannst du den Debugger von Borland verwenden. Borland IDE's haben imo ja einen recht komfortablen Debugger.
grüße
-
jaja, lehrer und ihre programme..erschreckend was die einem sogar an der uni als c++ code andrehen wollen..
while (interpret[i] != inter) { i++; // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt } // wird der Wert i um einen erhöht und es wird wieder kontrolliertdu solltest auch irgenwann aufhören über den array zu iterieren.
zb. mitwhile ( i < 1000 && interpret[i] != inter ) { i++; // Wenn der Arraywert in Feld i nicht mit dem gesuchten übereinstimmt } // wird der Wert i um einen erhöht und es wird wieder kontrolliertund auch beim ausgeben checken das du nicht ausserhalb der grenzen bist
if( i >= 1000 ){ cout << " " << endl; cout << "Interpret nicht gefunden!" << endl; else{ cout << " " << endl; cout << "CD Nummer: " << i << endl; cout << "Interpret: " << interpret[i] << endl; cout << "Titel: " << titel[i] << endl; cout << "Laenge: " << spieldauer[i] << endl; } cin.get();cin.get();vermutlich wird das prog jetzt nicht mehr mit ner access violation abschmieren, aber wohl nicht einen interpreten wieder finden richtig? oder klapts sogar?
und ggf. solltest du dir mal überlegen ne globale const variable MAXARRAYSIZE zu benutzen und diese in deinem programm zu benutzen. ist zwar nicht perfekt aber besser als die hardcodierten 1000 überall im programmcode zu haben.
also:const unsigned int MAXARRAYSIZE = 1000; . . . string interpret[MAXARRAYSIZE]; // Ein Array des Typen String mit 1000 Feldern float spieldauer[MAXARRAYSIZE]; // Ein Array des Typen Float mit 1000 Feldern string titel[MAXARRAYSIZE]; . . . while ( i < MAXARRAYSIZE && interpret[i] != inter ) . . if( i >= MAXARRAYSIZE ){nun kannst du an EINER stelle im code die größe deiner arrays verändern.