Leerzeichen ignorieren
-
Hallo Leute,
ich bin neu und habe mit Klassen jetzt begonnen. Dazu habe ich jedoch, auch wenn nicht Klassenbezogen, mal eine Frage, was mit jetzt erst auffällt.
In folgendem Quellcode soll der Name und die Adresse eingelesen werden und anschließend ausgegeben werden. Wenn ich jedoch einen namen eingebe wie: "Robin Hood", so setzt er Robin in name und Hood in adresse, was ja nicht sein soll, sondern Robin Hood soll in eine Zeile unter name stehen und unter adresse soll wieder etwas neues eingegeben werden.
Ich habe bereits gegooglet und mit anderen Typen probiert, string ist jedoch der einzigste mit dem es logisch funktioniert.Vielen Dank für eure Hilfe!
#include <iostream> #include <conio.h> using namespace std; class Person { private: string name; string adresse; public: void persDatenAusgeben(); void persDatenEingeben(); }; void Person::persDatenEingeben() { cout<<"Name: "<<endl; cin>>name; cout<<"Adresse: "<<endl; cin>>adresse; return; }; void Person::persDatenAusgeben() { cout<<"\n\n\nIhr Name ist: "<<name<<endl; cout<<"Ihre Adresse ist: "<<adresse<<endl; return; }; int main() { Person p1; p1.persDatenEingeben(); p1.persDatenAusgeben(); getch(); return 0; }
-
std::string name; std::getline (std::cin, name); // hier was mit leerzeichen eingeben
-
Vielen Dank.
Hat funktioniert. Wobei man könnte das std:: auch weglassen, da der erforderliche Header und Befehl im Quellcode stehen:#include <conio.h> using namespace std;Somit ist auch folgende Schreibweise ausreichend:
getline(cin, name); getline(cin, adresse);Trotzdem vielen lieben Dank!
Liebe Grüße
Tobi
-
Wobei man könnte das std:: auch weglassen, da der erforderliche Header und Befehl im Quellcode stehen:
std ist der namespace od. dt. namensraum.
simon
-
@ TobiisFreaky
using namespace suckt! benutz es nie mals, vorallen nicht in headern.
-
Hardcore C++ Coder schrieb:
@ TobiisFreaky
using namespace suckt! benutz es nie mals, vorallen nicht in headern.In Hedaer-Dateien vielleicht, warum aber soll "using namespace" in Quellcodedateien "sucken"?
MfG SideWinder
-
so nach der kleinen Hilfestellung eurerseits, habe ich das Programm soweit fertig.
Ihr könnt euch das ganze Programm mal anschauen und genauer unter die Lupe nehmen wenn ihr wollt. Verbesserungsvorschläge sind gerne gesehen.Vielen Dank nochmal an alle!
ps: Es ist eine Vererbung an eine weitere Klasse "Mitarbeiter" enthalten.
#include <iostream> #include <conio.h> using namespace std; class Person { private: string name; string adresse; public: void persDatenAusgeben(); void persDatenEingeben(); }; void Person::persDatenEingeben() { cout<<"Name: "<<endl; getline(cin, name); cout<<"Adresse: "<<endl; getline(cin, adresse); return; }; void Person::persDatenAusgeben() { cout<<"\n\n\nIhr Name ist: "<<name<<endl; cout<<"Ihre Adresse lautet: "<<adresse<<endl; return; }; class Mitarbeiter : public Person //Klasse Mitarbeiter erbt Objekte von Person { private: char einstellungsDatum[50]; public: void einstellungsDatumAusgeben(); void einstellungsDatumEingeben(); }; void Mitarbeiter::einstellungsDatumEingeben() { cout<<"Bitte Einstellungsdatum angeben: "<<endl; cin>>einstellungsDatum; return; } void Mitarbeiter::einstellungsDatumAusgeben() { cout<<"\n\nEinstellungsdatum: "<<einstellungsDatum; return; } int main() { // Person p1; Mitarbeiter m1; // p1.persDatenEingeben(); // p1.persDatenAusgeben(); m1.persDatenEingeben(); //können ggf. noch sortiert werden je nach Ausgabe. m1.persDatenAusgeben(); m1.einstellungsDatumEingeben(); m1.einstellungsDatumAusgeben(); getch(); }
-
benutze anstelle von char[..] einen std::string.
-
//Klasse Mitarbeiter erbt Objekte von Person
Von Objekten kann nicht geerbt werden, nur von Klassen.
-
#include <conio.h>
Wird soweit ich weiss nicht benötigt, also raus.
-
return ohne den control fluss zu ändern und bei void return type ist sinnlos.
also weglassen.
-
simon.gysi schrieb:
//Klasse Mitarbeiter erbt Objekte von Person
Von Objekten kann nicht geerbt werden, nur von Klassen.
Aber die Objekte (public) aus der Klasse werden doch weitervererbt oder stimmt das nicht?
-
simon.gysi schrieb:
#include <conio.h>
Wird soweit ich weiss nicht benötigt, also raus.
muss gesetzt werden, da das getch(); ansonsten nicht erkannt wird.
-
die return; waren überflüssig, hattest Recht.
Außerdem die Semikolon hinter den Funktionen ebenfalls.
Danke!
-
naja es gibt besser möglichkeiten statt getch(); am ende eines programms...
guck dazu mal in die faq
ansonsten sieht dein programm ganz ok aus für einen anfängeraber was du beim nächsten mal amcehn könntest wäre stt den code tags hier im forum die c++ tags zu verwenden
statt [ code] [ /code] schreisbt du [ cpp] [ /cpp] (natürlich ohne leerzeichen...)
-
Hmmm ich habe jetzt eine Virtuelstunde in den FAQ nachgekuckt und nichts darüber gefunden -.-
Mein Programmierlehrer schreibt am Ende aber auch immer getch();
Warum ist das denn so falsch???
Tobi
-
TobiisFreaky schrieb:
Hmmm ich habe jetzt eine Virtuelstunde in den FAQ nachgekuckt und nichts darüber gefunden -.-
Mein Programmierlehrer schreibt am Ende aber auch immer getch();
Warum ist das denn so falsch???
Tobi
Weils kein Standard ist. Dein Lehrer hat sich wohl lange nicht mehr mit C++ bzw. dessen Entwicklung befasst, wenn er char-Arrays und plattform- und/oder compilerspezifisches lehrt.
#include <iostream> #include <limits> // ... // ... int main() { // ersetzt getch() ganz gut... std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); }wäre eine möglichkeit, getch() zu ersetzen.
-
Kann dem jungen mal jemand den Unterschied zwischen:
std::cout << "\n\nblabla" << std::endl;und
std::cout << std::endl << std::endl << "blabla" << std::endl;erklären? Ist ja grauenvoll was hier praktiziert wird. In welchem verkackten Tutorial/Buch steht denn bitteschön das \n und std::endl equal sind?!
-
Nautilus schrieb:
Kann dem jungen mal jemand den Unterschied zwischen:
std::cout << "\n\nblabla" << std::endl;und
std::cout << std::endl << std::endl << "blabla" << std::endl;erklären? Ist ja grauenvoll was hier praktiziert wird. In welchem verkackten Tutorial/Buch steht denn bitteschön das \n und std::endl equal sind?!
Hm ich hab mal durch den Thread geblättert und nirgendwo gesehn dass jemand behauptet hätte, die beiden Dinge seinen "equal" - es hat auch niemand behauptet die std::endl Version wäre besser, also wo ist das Problem?
Ich nehme einfach mal an dass der OP das \n absichtlich eingesetzt hat, um das ständige flushen des Streams zu vermeiden - inmho ein legitimer Grund.