Mit nur ANSI C, was ist der beste Weg, um mit einiger Sicherheit festzustellen, ob eine C-Stil-String ist entweder eine ganze Zahl oder eine reelle Zahl (d. h. float / double)?
Verwenden Sie nicht atoi und atof, da diese Funktionen bei einem Fehler 0 zurückgeben. Das letzte Mal, als ich 0 überprüfte, ist eine gültige Ganzzahl und float, daher keine Verwendung zur Bestimmung des Typs.
Verwenden Sie die Funktionen strto {l, ul, ull, ll, d}, da diese beim Auftreten eines Fehlers die Fehlernummer festlegen und auch melden, wo die konvertierten Daten enden.
In diesem Beispiel wird davon ausgegangen, dass die Zeichenfolge einen einzelnen zu konvertierenden Wert enthält.
%Vor%Danke an Jonathan Leffler für den Hinweis, dass ich vergessen habe, zuerst errno auf 0 zu setzen.
Ich stimme Patrick_O zu, dass die Funktionen von strto {l, ul, ull, ll, d} der beste Weg sind. Es gibt jedoch ein paar Punkte zu beachten.
Abhängig von der jeweiligen Aufgabe arrangiere ich manchmal, dass am Ende des zurückgegebenen Konvertierungszeigers übergehender Leerraum übersprungen wird, und beschwere mich dann (ablehnen), wenn das letzte Zeichen nicht der abschließende Nullwert '\ 0' ist. Oder ich kann schlampig sein und Müll am Ende erscheinen lassen, oder ich kann optionale Multiplikatoren wie 'K', 'M', 'G', 'T' für Kilobyte, Megabyte, Gigabyte, Terabyte, ... oder andere akzeptieren Anforderung basierend auf dem Kontext.
Verwenden Sie strtol / strtoll (nicht atoi), um Ganzzahlen zu prüfen. Verwenden Sie strtof / strtod (nicht atof), um Doubles zu prüfen.
atoi und atof konvertieren den Anfangsteil des Strings, sagen aber nicht, ob sie den gesamten String verwendet haben oder nicht. strtol / strtod sagt dir, ob es nach der Umwandlung der Charaktere zusätzlichen Müll gegeben hat.
Denken Sie also in beiden Fällen daran, einen TAIL-Parameter ungleich Null zu übergeben, und prüfen Sie, ob er auf das Ende der Zeichenfolge zeigt (also ** TAIL == 0). Überprüfen Sie auch den Rückgabewert für Unterlauf und Überlauf (Details finden Sie in den Manpages oder im ANSI-Standard).
Beachten Sie auch, dass strod / strtol den anfänglichen Whitespace überspringt. Wenn Sie also Strings mit initialem Whitespace als schlecht formatiert behandeln möchten, müssen Sie auch das erste Zeichen überprüfen.
Es hängt wirklich davon ab, warum Sie zuerst fragen.
Wenn Sie nur eine Zahl analysieren wollen und nicht wissen, ob es sich um einen Gleitkommawert oder eine Ganzzahl handelt, dann parsen Sie einfach einen Gleitkommawert und parsen eine Ganzzahl korrekt.
Wenn Sie den Typ wirklich kennen möchten, zum Beispiel für die Triage, sollten Sie wirklich überlegen, die Typen in der Reihenfolge zu testen, die Sie für am relevantesten halten. Versuchen Sie beispielsweise, eine Ganzzahl zu analysieren, und wenn Sie nicht können, dann versuchen Sie, einen Gleitkommawert zu analysieren. (Andersherum werden nur ein paar mehr Floats produziert ...)
atoi und atof werden die Zahl selbst dann konvertieren, wenn nicht numerische Zeichen folgen. Wenn Sie jedoch strtol und strtod verwenden, wird nicht nur der führende Leerraum und ein optionales Zeichen übersprungen, sondern Sie erhalten einen Zeiger auf das erste Zeichen, das nicht in der Zahl enthalten ist. Dann können Sie überprüfen, ob der Rest Leerzeichen ist.
Tags und Links c floating-point numbers