String clearen?
-
also ich hab da ein problem,
ich hab ne function geschrieben, die zunächst prueft, ob die eingabe eine zahl ist, oder nicht und den string anschließend in einen double konvertiert.
wenn ich die function nun zwei mal aufrufe (siehe code) und beim ersten mal folgenden string eingebe: "123 234" dann wird beim ersten aufruf 123 returned und beim 2. versuch 234 returned, ohne dass ich jedoch eine 2. eingabe gemacht habe! ich moechte, dass der string beim erneuten aufruf leer ist und wieder eine normale eingabe gemacht werden kann!
ciao, ben
double eingabe(void) { char eingabe[] = ""; std::string eingabestring=(""); char *ep1; long double zahl; int stringlaenge; int digit; int kommazaehler; cin>>eingabe; eingabestring=eingabe; stringlaenge=eingabestring.length(); digit=1; kommazaehler=0; for (int k=0;k<=stringlaenge-1;k++){ if(isdigit(eingabe[k])==0 & (int)(eingabe[k])!=46) digit=0; if((int)(eingabe[k])==46) kommazaehler++; } if(digit==1 & kommazaehler<=1){ zahl = strtod(eingabe, &ep1); cout << "Zahl: "<<zahl; return zahl; } if (digit==0 || kommazaehler >= 2) cout<<"Eingabe ungueltig\n"; //canceln wenn mehr als 2 kommas oder nicht-zahlen eingegeben wurden } int main(){ eingabe(); eingabe(); return 0; }
-
Du machst es dir hier unnötig schwer. Ich würde zur Konvertierung einfach einen stringstream nehmen und den alles prüfen lassen.
Warum hast du neben eingabestring noch eingabe?
Beim if in der Schleife hast du ein & zuwenig.
Nach dem Ende der Funktion kann noch ein newline im Tatstaturpuffer sein, so dass die nächste Eingabe überlesen wird.
besser sodouble eingabe() { std::string eingabestring; // wird automatisch mit "" initialisiert cin >> eingabestring; // geht auch mit string cin.ignore(); //letztes Newline entfernen double Zahl; stringstream Str; Str << eingabestring; // String in den stringstream if( Str >> Zahl) // Zahl auslesen wenn möglich { cout << "Zahl: "<<zahl; return Zahl; else { cout<<"Eingabe ungueltig\n"; return 0.0; } }
-
erstmal vielen dank!
deine function genau das gleiche, wie meine - mein problem ist leider bestehen geblieben, wenn du "12 12" eingibst passiert das gleiche wie mit dem alten
ich hab das ganze ein wenig abgewandelt und hole den string nun ueber den getline befehl!
der fehler den ich vorher hatte ist dann weg - aber wenn ich nun "12..1" eingebe
returned die function 12. ich haette dies aber gern als ungueltige eingabe gedeutet!ciao, ben
prog
double eingabe() { std::string eingabestring; // wird automatisch mit "" initialisiert getline(cin,eingabestring); //cin.ignore(); //letztes Newline entfernen double Zahl; stringstream Str; Str << eingabestring; // String in den stringstream if( Str >> Zahl) // Zahl auslesen wenn möglich { cout << "Zahl: "<<Zahl; return Zahl; } else { cout<<"Eingabe ungueltig\n"; return 0.0; } }
-
ersetze das hier
cin >> eingabestring;
mal durch das hier
getline(cin, eingabestring);
Warum das andere nicht funktioniert muß ich erst noch rausbekommen.
-
Machs mal so
double eingabe() { std::string eingabestring; // wird automatisch mit "" initialisiert getline(cin.eingabestring); double Zahl(0.0); stringstream Str; Str << eingabestring; // String in den stringstream if(Str >> Zahl && Str.eof()) // Zahl auslesen wenn möglich { cout << "Zahl: "<< Zahl << endl; } else { cout << "Eingabe ungueltig\n" << endl; } cin.clear(); // löscht die Fehlerflags in ci cin.ignore(cin.rdbuf()->in_avail()); // entfernt restliche Zeichen aus der Eingabe return Zahl; }
Das Einlesen über den Stringstream ist fehlertoleranter als ich erwartet habe. Wenn allerdings das Zeichen, und nur das Zeichen drin steht, wird eof zu true. Das sieht mir aber irgendwie nach einem schrägen Workaround aus.
Ich habs mal mit boost::lexical_cast probiert. Der wirft bei 12..1 eine Exception.Ach so
ignorier mal meinen vorigen Post. Ich habe irgendwie deinen letzten nicht vollständig gelesen. Ist wohl zu warm hier (36°C im Büro).
-
ich hab das jetzt noch nicht getestet, aber das programm oben von mir deckt alle diese eingaben ab.
ich koennte die eingabe nun ueber den getline befehl holen, habe die eingabe dann allerdings als string, ich weiss nun nicht, wie ich diesen string in ein character arrey konvertiere, kannste mir da evtl. helfen?
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum DOS und Win32-Konsole verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hallo,
c_str() hilft.
MFG winexec*
-
und wie ist da die syntax konkret?
-
macinstyle schrieb:
und wie ist da die syntax konkret?
std::string s("Hallo"); const char *p = s.c_str();
Siehe auch:
http://www.cppreference.com/cppstring/c_str.htmlMfG
GPC