Wie überprüft man, ob vor dem Aufruf von atoi () eine ganze Zahl steht?

7

Ich möchte eine Ganzzahl als Befehlszeilenargument verwenden, aber wenn der Benutzer eine nicht ganzzahlige Zeichenfolge übergibt, führt dies zu einem Stapelüberlauf. Was ist die Standardmethode um sicherzustellen, dass atoi () erfolgreich ist?

    
cilk 03.10.2010, 16:23
quelle

8 Antworten

20

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.

    
zserge 03.10.2010 16:26
quelle
6

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.

%Vor%

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)

%Vor%     
Ring Ø 03.10.2010 16:26
quelle
1

Dies verursacht keinen Stapelüberlauf. atoi gibt 0 zurück, wenn am Anfang der Zeichenfolge keine Nummer gefunden werden kann. Ihre (Nicht-) Behandlung von 0 verursacht den Stapelüberlauf.

    
Amadan 03.10.2010 16:27
quelle
1

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.

    
R.. 03.10.2010 16:28
quelle
0

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.

Ссылка

    
Lou Franco 03.10.2010 16:28
quelle
0

Dies könnte Ihnen helfen. Überprüfen Sie strtol in stdlib.h

    
Sachin Shanbhag 03.10.2010 16:34
quelle
0

Entweder Sie können dies tun und Undefined Behavior Land eingeben, Sie könnten eine einfache Validierungsfunktion wie folgt schreiben:

%Vor%

Bitte beachten Sie, dass Sie diese Funktion aufrufen müssen, bevor Sie atoi () aufrufen, und Sie string.h und stdio.h benötigen.

    
Alex 03.10.2010 18:30
quelle
0

atoi() konvertiert die Zeichenkette in eine ganze Zahl, wenn sie nur Ziffernzeichen enthält, andernfalls wird 0 zurückgegeben.

    
Cornul11 08.08.2016 07:19
quelle

Tags und Links