Stringbearbeitung
-
Hallo,
ich habe folgendes erstellt:
//strings.h
#include<iostream>
#include<string>using namespace std;
class strings
{
private:
string eingabe;public:
void setstring();
void getstring();
int string_laenge();
void erase_string();};
//strings_m.cpp
#include"strings.h"void main()
{
bool dummy=true;
int str_laenge;strings String1;
while(dummy==true)
{
String1.setstring();
String1.getstring();
str_laenge=String1.string_laenge();
String1.erase_string();
cout<<"\n\nErneut ausfuehren?"<<endl;
cin>>dummy;
if(dummy==1)
dummy=true;
else
dummy=false;
}
};//strings.cpp
#include"strings.h"void strings::setstring()
{
cout<<"Geben Sie beliebige Zeichen ein:"<<endl;
getline(cin, eingabe);
};void strings::getstring()
{
cout<<"Ihr eingegebener String enthaelt folgende Zeichen:\n"<<eingabe;
};int strings::string_laenge()
{
int str_laenge;
cout<<"\nAnzahl der Zeichen:"<< eingabe.length();
str_laenge=eingabe.length();
return str_laenge;
}void strings::erase_string()
{
eingabe=eingabe.erase();
};Beim ersten Durchlauf läuft noch alles wie es soll...
das problem ist jetzt das, sobald ich den dummy wieder auf 1 setze, zwar das prgm wohl ausgeführt wird... getline aber nicht.wär super wenn mir jmd meinen fehler zeigen könnte!
danke schonmal im voraus

-
Hallo fcb_fh1,
Willkommen im C++-Forum.
fcb_fh1 schrieb:
ich habe folgendes erstellt:
//strings.h #include<iostream> #include<string> using namespace std; class strings { private: string eingabe; public: void setstring(); void getstring(); int string_laenge(); void erase_string(); }; //strings_m.cpp #include"strings.h" void main() { bool dummy=true; int str_laenge; strings String1; while(dummy==true) { String1.setstring(); String1.getstring(); str_laenge=String1.string_laenge(); String1.erase_string(); cout<<"\n\nErneut ausfuehren?"<<endl; cin>>dummy; if(dummy==1) dummy=true; else dummy=false; } }; //strings.cpp #include"strings.h" void strings::setstring() { cout<<"Geben Sie beliebige Zeichen ein:"<<endl; getline(cin, eingabe); }; void strings::getstring() { cout<<"Ihr eingegebener String enthaelt folgende Zeichen:\n"<<eingabe; }; int strings::string_laenge() { int str_laenge; cout<<"\nAnzahl der Zeichen:"<< eingabe.length(); str_laenge=eingabe.length(); return str_laenge; } void strings::erase_string() { eingabe=eingabe.erase(); };Dass Dein Programm nicht so arbeitet, wie Du es erwartest, liegt an der Eingabe in Zeile 38. Dort gibst Du eine Zahl ein und drückst die 'Enter'-Taste, welche ein Zeilenende in den Eingabebuffer schreibt. Gelesen wird in dem Programm nur die Zahl, das Zeilenende bleibt stehen und wird später von getline als Leerstring eingelesen.
Also musst Du nach der Eingabe alles inklusive dem LF (Zeilenende) aus dem Eingabebuffer entfernen.
Ändere Zeile 38 nach(cin>>dummy).ignore(999,'\n'); // '\n' == LFdann klappt's.
Gruß
Werner
-
[EDIT]: Zu langsam
PS: main() gibt einen Integer zurück.
gruß
syntax
-
Vielen Dank für die schnelle Antwort Werner.
So läuft das Programm!Mir ist jetzt klar, was in dem bisherigen einfachen "cin" falsch war, aber was macht jetzt genau der "ignore(999,'\n')"-Befehl?
Ich verstehe das jetzt so, dass die Zeichen eingelesen werden, aber alles was ab der '\n'-Eingabe folgt "ignoriert" wird.
Mir ist der Aufbau des "ignore"-Befehls aber noch nicht vollends klar.
Was bewirkt z.B. die 999?@syntax: Danke für deinen Kommentar. Ich hab das so von meinem Prof. beigebracht bekommen. Der Aufbau mit "int main(void)" ist mir mittlerweile auch schon öfter untergekommen.
Wieso sollte man das denn besser so schreiben? Ist das "void main()" nicht mehr aktuell?
-
Der Standard sagt: Main muss auf jeden Fall int zurückgeben. Das war schon immer so und wird auch immer so bleiben. Was die Parameter angeht, müssen die folgenden beiden Signaturen funktionieren:
int main() int main(int argc, char** argv)Weitere Signaturen dürfen vom Compiler unterstützt werden, der Standard spricht sich darüber aber nicht weiter aus.
int main(void)ist äquivalent zu
int main()wirkt aber wie von einem C-Programmierer kommend, der sich weigert, ordentlich C++ zu lernen.

-
fcb_fh1 schrieb:
aber was macht jetzt genau der "ignore(999,'\n')"-Befehl?
ignoreignoriert (ignorieren = Zeichen lesen und dann verwerfen) im Puffer stehende Zeichen. In diesem Fall werden entweder 999 Zeichen ignoriert oder es werden solange Zeichen ignoriert, bis man auf das '\n'-Zeichen stößt (das '\n'-Zeichen wird dann ebenfalls ignoriert).fcb_fh1 schrieb:
Ist das "void main()" nicht mehr aktuell?
void mainwar, ist und wird immer falsch sein, da es weder der C++-Standard noch dem C-Standard erlaubt. Dass es manche Compiler schlucken macht es auch nicht richtiger, sondern ist eher ein Hinweis für dich, dass der Compiler ewig alt ist und aus Zeiten stammt, in denen noch nicht so viel Wert auf Standardkonformität gelegt wurde.
-
Ich habe das nur mit void main von meinem Prof so beigebracht bekommen.

Aber danke für den Hinweis, dann werde ich ab jetzt mit int main() arbeiten.Stimmt übrigens Kellerautomat... ich habe vorher in C programmiert und jetzt mit C++ begonnen

Danke vielmals Gugelmoser, jetzt weiß ich vollends Bescheid!

-
fcb_fh1 schrieb:
Ich habe das nur mit void main von meinem Prof so beigebracht bekommen.
Auch Profs sind nicht unfehlbar. Die Erfahrung zeigt vielmehr, dass gerade "erfahrene" Profs sehr häufig bei irgendwelchem Prä-Standard-Halbwissen anfang der Neunziger stehengeblieben sind. "void main" ist ein erster Hinweis, dass dein Prof zu dieser Spezies gehören könnte. Leider belibt einem da nichts anderes übrig, als sich ein aktuelles gutes C++ Buch zu besorgen (eine Liste findest du in der FAQ) und alles zu hinterfragen und abzugleichen, was der Prof als Tatsachen hinstellt
