Sie können verwenden:
long int strtol(const char *nptr, char **endptr, int base);
Dann überprüfe ob *endptr != nptr
. Dies bedeutet, dass die Zeichenfolge mindestens mit der Ganzzahl beginnt.
Sie können auch überprüfen, dass * endptr auf den abschließenden Nullpunkt zeigt, was bedeutet, dass die gesamte Zeichenfolge erfolgreich analysiert wurde.
atoi()
wird (sollte) keinen Stapelüberlauf verursachen, wenn die Zeichenfolge andere Zeichen als Ziffern enthält. Es wird einfach in eine int
eine beliebige Zahl umgewandelt, die vom Anfang der Zeichenfolge gefunden wird, bis es keine mehr gibt.
Sie können überprüfen, dass es keinen Integer-Überlauf gibt (Zahl außerhalb des Bereichs von [-2 ^ 31, 2 ^ 31-1] in einer modernen (aktuellen) PC-Architektur).
>Bearbeiten (Kommentare)
Während die C-Standards vor einem undefinierten Verhalten warnen , wenn der Wert nicht dargestellt werden kann, stürzen die gängigsten C-Compiler (gcc, MS ...) nicht ab Wenn der Wert nicht akzeptabel ist (außer der Zeiger char *
ist natürlich null oder falsch).
Wie auch immer, Sie können Ihr eigenes atoi()
einfach implementieren (mit denselben Einschränkungen wie in meiner Antwort)
Ursache ein Stapelüberlauf? Nun, ich nehme an, das ist ein mögliches Ergebnis des undefinierten Verhaltens , wenn der Wert in der Zeichenfolge den Bereich von int
überschreitet. In der Praxis, obwohl es normalerweise nur ein falsches Ergebnis umschließt oder zurückgibt.
Wenn Sie eine bessere Fehlerprüfung wünschen, verwenden Sie strtol
anstelle von atoi
. Es hat ein wohldefiniertes Verhalten beim Überlauf (es setzt errno
, das Sie vor dem Aufruf von strtol
auf 0 zurücksetzen müssen, damit Sie zwischen zurückgegebenen Fehlern und berechtigten Werten unterscheiden können) und Sie können den Punkt in der Zeichenkette untersuchen die Konvertierung wurde gestoppt, um zu sehen, ob die vollständige Zeichenfolge eine ganze Zahl war oder ob nach dem Ende zusätzlicher Inhalt vorhanden ist.
Ich glaube nicht, dass ein Standard-Atoi Stackoverflow wird, aber es gibt keine Möglichkeit zu sagen, ob Sie eine ganze Zahl damit haben. Verwenden Sie stattdessen strtol
- es ist möglich, mit Nicht-Ganzzahlen umzugehen.