Ich habe ein Problem mit einem Programm, an dem ich in C ++ arbeite. Ich bitte den Benutzer, eine gültige Nummer einzugeben. Ich nehme es als String auf, weil die bestimmte Aufgabe, die ich mache, es auf lange Sicht einfacher macht. Für die grundlegende Fehlerprüfung möchte ich überprüfen, ob die eingegebene Nummer eine gültige Nummer ist. Beispiel:
%Vor%Verwenden Sie strtod, das eine Zeichenfolge in ein Double konvertiert und alle Zeichen zurückgibt, die nicht als Teil des Double interpretiert werden konnten.
%Vor%So:
%Vor% Sie können strtoX
verwenden (wobei X f
für float, l
für long, ul
für unsigned long usw. ist), indem Sie die gewünschte Zahl wählen. Einer der Parameter, den Sie angeben, ist ein "End-Zeiger", der auf das erste Zeichen in der Zeichenfolge zeigt, das nicht in den Ziel-Nummerntyp konvertiert werden kann.
In Ihrem Fall suchen Sie offensichtlich, dass der Endzeiger am Ende der Zeichenfolge stehen sollte, um anzuzeigen, dass alle Zeichen in der Zeichenfolge in den Zieltyp konvertiert wurden.
Bearbeiten: Sorry, habe nicht bemerkt, dass du im Titel "double" erwähnt hast (aber nicht die Frage selbst). In diesem Fall würden Sie strtod
verwenden, wie einige andere auch empfohlen haben.
Am besten versuchen Sie , Ihre Zeichenfolge in double
zu konvertieren, indem Sie eine der standardmäßigen und / oder idiomatischen Methoden zur Konvertierung verwenden und anschließend auf Fehler prüfen. In C wären das Funktionen von strto...
group (die natürlich auch in C ++ perfekt verwendbar sind). In C ++ können Sie Stream-basierte Konvertierungssprache verwenden.
Eine Sache, auf die man achten sollte, ist, dass die übliche Konvention in den Standard-Konvertierungsmethoden darin besteht, "so viel wie möglich" zu konvertieren und keine zusätzlichen Zeichen als Fehler zu betrachten. Zum Beispiel wird eine Zeichenkette "123abc" normalerweise als gültige Eingabe betrachtet, wobei nur der Teil "123" umgewandelt wird. Alle verwendbaren Methoden bieten Ihnen die Möglichkeit, die Tatsache zu erkennen, dass nach der tatsächlichen Zahl etwas Zusätzliches vorhanden ist, wenn Sie diese Situation als Fehler behandeln möchten. Aber es liegt an Ihnen, die zusätzlichen Schritte zu ergreifen, um diese Überprüfung durchzuführen.
Ah, ich liebte diese Aufgaben. Ein guter alter Hand geschriebener Lexer ist der Weg zu gehen (da Sie noch in den Anfängen sind - versuchen Sie noch nicht, boost
zu verwenden). Sie sind schnell, einfach zu schreiben und extrem lustig zu spielen. Wenn Sie eine Kopie von Levines Buch über Lex / Yacc erhalten können, lesen Sie die ersten Kapitel nach Ideen.
Wie von AndreyT erwähnt, versucht man am besten, die Zeichenfolge in einen Gleitkommawert zu konvertieren und auf einen Fehler zu prüfen. Persönlich würde ich std :: istringstream verwenden, da Sie C ++ verwenden. Etwas wie das Folgende sollte funktionieren:
%Vor%istringstream ist Teil von STL, Sie sollten also keine zusätzlichen Bibliotheken benötigen, und es wird auch mit Ausnahmen funktionieren, wenn Sie das möchten. Weitere Informationen finden Sie hier: Ссылка