Onkel-Ho Geschrieben 12. März 2002 Geschrieben 12. März 2002 moin! also erstma! mache noch nich solange C/C++. Zu meiner Frage. Ich will Sätze mit cin.getline einlesen. Irgendwelche Daten wie : Peter Müller oder so. Halt mit Leerzeichen. Mit cin >> geht das ja nicht. So weit so gut. Das funzt ja auch alles, bloss habe ich in jetzt noch n switch drin. um die einzelnen fälle vom switch aufzurufen, muss ich dafür ja ne zahl einlesen. Aber irgendwie verträgt sich cin >> mit cin.getline net. Wenn ich beides im selben Proggi nutze. Was kann ich sonst noch nutzen, um zahlen einzulesen ??? Zitieren
Woodstock Geschrieben 12. März 2002 Geschrieben 12. März 2002 Versuch es einfach mal so, das Du eine Zeile unter der in der Du mit cin >> etwas einliest folgendes zu schreiben. cout << endl; Dann müßte es funktionieren. Ich denke Dein Problem ist nämlich nur das der Puffer nicht geleert ist. Schreib mal ob es geklappt hat. Sabine Zitieren
Poldi Geschrieben 12. März 2002 Geschrieben 12. März 2002 Poste doch mal nen Auszug von deinem Quellcode. Zitieren
capitanx Geschrieben 13. März 2002 Geschrieben 13. März 2002 Aber sicher geht das mit cin! void main(void) { char* satz; cout << "Bitte Satz eingeben: "; cin >> satz; cout << "\nSie haben eingegeben:\n\n" << satz; } //main Wenn man nur "char satz;" schreibt geht das nicht weil "char" ja nur ein Buchstabe ist. Aber ein Zeiger auf Buchstaben (char*) entspricht einem String. Zitieren
Woodstock Geschrieben 13. März 2002 Geschrieben 13. März 2002 Ich denke auch das Du mal ein bisschen Quelltext posten solltest. Sonst können wir Dir nicht wirklich helfen.... Bine Zitieren
Onkel-Ho Geschrieben 13. März 2002 Autor Geschrieben 13. März 2002 soll ich den ganzen Quelltext hier posten ? Zitieren
Woodstock Geschrieben 13. März 2002 Geschrieben 13. März 2002 Ja, mach ruhig mal. Dann kann man Dein Problem besser verstehen und erkennen woran es liegen könnte. Bine Zitieren
Onkel-Ho Geschrieben 13. März 2002 Autor Geschrieben 13. März 2002 dann poste ich mal den quellcode: #include <iostream> #include <iomanip> #include <conio> #include <stdio> #include <string> using namespace std; struct Adresse { char name[50]; char strasse[25]; char ort[25]; char telefon[15]; }; char * pch; struct Adresse adressdaten[7]; int eingabeMenu = 0; //*************** Prototypen ********************* void ausgabe(); void eingabe(); //*************** Hauptfunktion ********************* int main() { do { cout << "1)Adressdaten eingeben\n"; cout << "2)Adressdaten anzeigen\n"; cout << "3)Programmende\n"; cin >> eingabeMenu; cout << endl; switch(eingabeMenu) { case 1: { eingabe(); break; } case 2: { ausgabe(); break; } case 3: { break; } default: { cout << "\n\nSie muessen einen Wert zwischen 1 und 3 eingeben!"; break; } } } while(eingabeMenu !=3); return 0; } //**************** Eingabe **************** void eingabe() { cout << "\nJetzt werden die Daten eingelesen / Bitte keine Leerzeichen eingeben!"; cout << "\nGeben Sie den Strassennamen ein: "; cin >> adressdaten[0].strasse; cout << "\nGeben sie ihren Namen ein: "; cin >> adressdaten[0].name; pch = strtok (adressdaten[0].name, " "); cout << "\nGeben Sie ihren Wohnort ein: "; cin >> adressdaten[0].ort; cout << "\nGeben Sie ihre Telefonnummer ein: "; cin >> adressdaten[0].telefon; } //*************** Ausgabe ****************** void ausgabe() { cout << adressdaten[0].strasse << endl; while (pch != NULL) { cout << "\n" << pch; pch = strtok (NULL, " ,."); } // cout << adressdaten[0].name << endl; cout << adressdaten[0].ort << endl; cout << adressdaten[0].telefon << endl; } so is nich wirklich übersichtlich, aber ich hoffe das ihr mir trotzdem helfen könnt. Zitieren
Woodstock Geschrieben 13. März 2002 Geschrieben 13. März 2002 Die Lösung ist gar nicht so schwer. Du musst nur in dem Bereich wo Du dann einließt das '\n' ignorieren. Also so: #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdio.h> #include <string.h> struct Adresse { char name[50]; char strasse[25]; char ort[25]; char telefon[15]; }; struct Adresse adressdaten[7]; int eingabeMenu = 0; //*************** Prototypen ********************* void ausgabe(); void eingabe(); //*************** Hauptfunktion ********************* int main() { do { cout << "1)Adressdaten eingeben\n"; cout << "2)Adressdaten anzeigen\n"; cout << "3)Programmende\n"; cin >> eingabeMenu; cout << endl; switch(eingabeMenu) { case 1: { eingabe(); break; } case 2: { ausgabe(); break; } case 3: { break; } default: { cout << "\n\nSie muessen einen Wert zwischen 1 und 3 eingeben!" << endl; break; } } } while(eingabeMenu !=3); return 0; } //**************** Eingabe **************** void eingabe() { cin.ignore(1, '\n'); cout << "\nJetzt werden die Daten eingelesen!"; cout << "Geben Sie den Strassennamen ein: "; cin.getline(adressdaten[0].strasse, 25); cout << "Geben sie ihren Namen ein: "; cin.getline(adressdaten[0].name, 50); cout << "Geben Sie ihren Wohnort ein: "; cin.getline(adressdaten[0].ort, 25); cout << "Geben Sie ihre Telefonnummer ein: "; cin.getline(adressdaten[0].telefon, 15); cout << "\n\n"; } //*************** Ausgabe ****************** void ausgabe() { cout << adressdaten[0].name << endl; cout << adressdaten[0].strasse << endl; cout << adressdaten[0].ort << endl; cout << adressdaten[0].telefon << endl; cout << "\n\n"; }[/PHP] Bine Zitieren
Poldi Geschrieben 13. März 2002 Geschrieben 13. März 2002 um zahlen einzulesen kannst du noch scanf() benutzen. du kannst cin und cin.getline aber auch gemeinsam nutzen. du mußt nur nach jeder benutzung den inputpuffer leeren (stdin). also nach jedem cin bzw cin.getline() den befehl fflush(stdin); dann ist der eingabe puffer wieder jungfräulich. mit scanf hast du aber auch vielfältige möglichkeiten in mehrere variablen gleichzeitig einzulesen. guck am besten mal in deiner literatur dazu nach. Zitieren
Poldi Geschrieben 13. März 2002 Geschrieben 13. März 2002 übrigend, cin.getline liest in ein char array nicht in eine Variable vom Typen String. Zitieren
Onkel-Ho Geschrieben 14. März 2002 Autor Geschrieben 14. März 2002 wie meinst das! is das jetzt auf mein Beispiel bezogen oder meintest du das jetzt allgemein? Zitieren
Poldi Geschrieben 14. März 2002 Geschrieben 14. März 2002 allgemein. weil cin ja in String einlesen kann. das kann cin.getline nicht. da brauchste n char string[200] oder so. Zitieren
Orffi Geschrieben 19. März 2002 Geschrieben 19. März 2002 Hallo zusammen! Ich wollte schnell ein paar allgemeine Bemerkungen loswerden: void main (void) entspricht nicht dem ANSI/ISO C++-Standard. Es wird von vielen Compilern akzeptiert, ist aber nicht richtig und sollte nie benutzt werden, da so kein Rückgabewert ans Betriebssystem geliefert wird. cout << endl; ist um den Puffer zu leeren aus mehreren Gründen nicht nötig: 1) cout << endl; ist ein zusammengesetztes cout << '\n'; cout.flush(); Wenn es also nur darum geht den Puffer zu leeren, dann reicht ein cout.flush(). 2) Auch ein cout.flush() ist nicht nötig weil man cout und cin mit tie() aneinander binden kann, so daß zum Beispiel die Ausgabe auf dem Bildschirm erscheint bevor die Eingabe erwartet wird. 3) Auch tie() ist nicht nötig, da der Standard besagt, daß die beiden Streams (cin, cout) syncronisiert sind, also die Ausgabe vor der Eingabe ausgeführt wird. using namespace std sollte man besser in die einzelnen Funktionen hereinziehen, oder wenn es kleine Funktionen sind, die nicht soviele cin, cout, etc aus dem Standard Namespace haben mit std:: arbeiten. So wird verhindert, daß man Namensüberschneidungen hat. Dies kann unter umständen zu sehr komischen Fehlermeldungen führen. Und ganz wichtig: char *string; ist bei weitem kein String!!!! Es ist ein Zeiger auf einen Datentyp char. char *satz ="Hallo Welt!"; funktioniert nur, weil der Compiler zur Übersetzungszeit sieht, Hallo Welt hat soundso viel Buchstaben, also brauche ich soundsoviel Speicher. ich kann jetzt sicherlich nicht satz erweitern. Wenn man char *satz; hat, dann muß man, wenn man sich in C befindet mit malloc speicher reservieren, oder in C++ new benutzen. malloc funktioniert zwar auch in C++ doch sollte man hier wirklich auf new zurückgreifen. Jan Zitieren
DonMaro Geschrieben 19. März 2002 Geschrieben 19. März 2002 Original geschrieben von Orffi Es ist ein Zeiger auf einen Datentyp char. char *satz ="Hallo Welt!"; funktioniert nur, weil der Compiler zur Übersetzungszeit sieht, Hallo Welt hat soundso viel Buchstaben, also brauche ich soundsoviel Speicher. ich kann jetzt sicherlich nicht satz erweitern. Aber eben das ist doch gute dynamische Speicherverwaltung, oder ??? Zitieren
Orffi Geschrieben 19. März 2002 Geschrieben 19. März 2002 Es kommt darauf an, was man als gut empfindet. Das entscheidene hier ist: "zur Übersetzungszeit". Hier ist überhaupt nichts Dynamisches. Dynamisch bedeutet, daß irgendetwas zur Laufzeit passiert. Im allgemeinen hat man unter C++ Strings die man benutzen sollte, da hier die ganze Speicherverwaltung von string geregelt wird. Worauf ich hinaus wollte war: char *satz; ist definitiv kein Speicherplatz für einen String. Bei "char *satz;" reserviert der Compiler Speicherplatz für einen Zeiger, der auf char zeigt. Mehr nicht und das ist meilenweit davon entfernt ein string zu sein. HTH Jan Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.