Wie kann ich überprüfen, ob eine als String gespeicherte Zahl (double type) eine gültige doppelte Zahl in C ++ ist?

7

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%     
Tshepang 28.01.2010, 17:19
quelle

11 Antworten

9

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%     
Alex Brown 28.01.2010 17:25
quelle
7

Ich denke boost :: lexical_cast sollte dir hier helfen

    
Chris Card 28.01.2010 17:21
quelle
4

Ein Beispiel, das nur Standard-C ++ verwendet:

%Vor%

Bonus generische Vorlage Funktion Version:

%Vor%     
luke 28.01.2010 17:37
quelle
3

Wenn Sie keinen Boost haben, können Sie strtod

verwenden     
Drakosha 28.01.2010 17:23
quelle
3

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.

    
Jerry Coffin 28.01.2010 17:24
quelle
2

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.

    
AnT 28.01.2010 17:24
quelle
1

Eine einfache Option ist die Verwendung der sscanf-Funktion:

%Vor%

Wenn Sie Lust haben, können Sie istringstream verwenden:

%Vor%

Wenn du extravagant werden willst, kannst du lexical_cast von boost verwenden:

%Vor%     
Manuel 28.01.2010 17:31
quelle
0

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.

    
dirkgently 28.01.2010 17:23
quelle
0

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: Ссылка

    
icabod 28.01.2010 17:38
quelle
0

Sie könnten reguläre Ausdrücke verwenden. Da Sie bereits eine Zeichenfolge haben, wäre es leicht, dies mit dieser Regex zu vergleichen:

%Vor%

Die Bibliothek regex.h kann Ihnen hier helfen. Siehe hierzu: regex.h

    
Aaron 28.01.2010 17:43
quelle
0

Das ist mein schneller Hack:)

%Vor%     
AraK 28.01.2010 18:36
quelle

Tags und Links