Bestimmen, ob ein string, ein integer oder ein float in ANSI-C
Nur mit ANSI-C, was ist der beste Weg, um mit ziemlicher Sicherheit zu bestimmen, wenn ein C-Stil-string ist entweder eine ganze Zahl oder eine reelle Zahl (ich.e float/double)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht verwenden, atoi und atof da diese Funktionen geben 0 bei Fehler. Letztes mal habe ich geprüft 0 ist ein Gültiger integer-und float, daher keine Verwendung für die Bestimmung-Typ.
verwenden Sie die strto{l,ul,ull,ll,d} Funktionen, wie diese setzen errno im Fehlerfall, und auch berichten, wo die konvertierten Daten beendet.
strtoul: http://www.opengroup.org/onlinepubs/007908799/xsh/strtoul.html
diesem Beispiel wird davon ausgegangen, dass der string enthält nur einen einzigen Wert Umgerechnet werden.
Dank an Jonathan Leffler für den Hinweis, den ich vergaß zu setzen errno auf 0 ersten.
errno
ist ein makro, das expandiert zu einer veränderbaren lvalue. Normalerweise ist es erweitert, um(*__errno_location())
oder ähnliches.Mit sscanf, können Sie sicher sein, wenn der string ein float oder int oder was auch immer, ohne Besondere Fall 0, da der Fall mit atoi und atof Lösung.
Hier einige Beispiel-code:
sscanf
gegen eine string-Länge ist nicht zur Arbeit zu gehen, denn es gibt die Anzahl der erfolgreich konvertierten Elemente, nicht die Anzahl der Zeichen für die Konvertierung. aber die%n
- format kann hier helfen.atoi und atof konvertieren oder return 0, wenn Sie es nicht können.
Ich Stimme mit Patrick_O, dass die strto{l,ul,ull,ll,d} Funktionen sind der beste Weg zu gehen. Es gibt ein paar Punkte zu sehen, obwohl.
Je nach den job bei der hand, werde ich manchmal veranstalten zu überspringen Leerraum am Ende der Konvertierung Zeiger zurückgegeben, und dann beschweren sich (ablehnen), wenn das Letzte Zeichen nicht das abschließende Nullzeichen '\0'. Oder ich habe schlampig und lassen Müll am Ende, oder ich kann akzeptieren, optional Multiplikatoren wie 'K', 'M', 'G', 'T' für Kilobyte, Megabyte, Gigabyte, Terabyte, ... oder jede andere Anforderung, basierend auf dem Kontext.
Ich nehme an, Sie könnten Schritt für Schritt durch den string und prüfen, ob es irgendwelche
.
Zeichen. Das ist nur die erste Sache, die tauchte in meinem Kopf, aber, so bin ich sicher, es gibt andere (bessere) Wege zu mehr Sicherheit.Verwenden strtol/strtoll (nicht atoi) zu überprüfen zahlen.
Verwenden strtof/strtod (nicht atof), um zu überprüfen verdoppelt.
atoi und atof konvertiert den ersten Teil der Zeichenfolge, aber don ' T sagen Ihnen, ob oder nicht, Sie verwendet alle der Zeichenfolge. strtol/strtod Ihnen sagen, ob es extra junk-nach dem Zeichen umgewandelt.
So, in beiden Fällen, denken Sie daran, pass in ein nicht-null-TAIL-parameter und überprüfen Sie, dass es Punkte an das Ende der Zeichenfolge (das heißt, **TAIL == 0). Auch überprüfen Sie den Rückgabewert für den Unterlauf und den überlauf (siehe die man-Seiten oder ANSI-standard für details).
Beachten Sie auch, dass strod/strtol überspringen anfänglichen whitespace-Zeichen, wenn Sie so wollen, zur Behandlung von strings mit den ersten whitespace-Zeichen, wie schlecht formatiert, Sie müssen auch prüfen, ob das erste Zeichen.
Es hängt wirklich davon ab, warum Sie Sie bitten, in den ersten Platz.
Wenn Sie nur wollen, um zu analysieren, eine Nummer und weiß nicht, ob es ist ein float oder integer, dann nur parse float, es wird richtig analysiert, der eine ganze Zahl als gut.
Wenn Sie wirklich wollen, zu wissen, die Art, vielleicht für die triage, dann sollten Sie sich wirklich überlegen, die Prüfung der Arten in der Reihenfolge, die Sie als die wichtigsten. Wie versuchen Sie zu analysieren ist eine ganze Zahl, und wenn Sie nicht können, dann versuchen Sie zu analysieren ist eine float. (Anders herum produzieren nur ein wenig mehr schwimmt...)
atoi und atof wandelt die Zahl, auch wenn es nachgestellte nicht numerische Zeichen. Jedoch, wenn Sie verwenden, strtol und strtod es wird nicht nur überspringen führende Leerzeichen und einem optionalen Vorzeichen, aber verlassen Sie mit einem Zeiger auf das erste Zeichen, das nicht in die Reihe. Dann können Sie überprüfen, dass die rest ist Leerraum.
Gut, wenn Sie nicht das Gefühl, wie mit einer neuen Funktion wie strtoul, können Sie einfach fügen Sie ein anderes strcmp-Anweisung, um zu sehen, ob der string 0 ist.
d.h.