Heim > Backend-Entwicklung > C++ > Wie kann ich Fehler bei der Verwendung von strtol in C und C richtig behandeln?

Wie kann ich Fehler bei der Verwendung von strtol in C und C richtig behandeln?

Barbara Streisand
Freigeben: 2024-12-25 15:35:09
Original
866 Leute haben es durchsucht

How Can I Properly Handle Errors When Using strtol in C and C  ?

Richtige Verwendung von strtol mit Fehlerbehandlung

Das folgende C- oder C-Programm konvertiert Zeichenfolgen in lange Ganzzahlen und verlässt sich dabei auf die Tatsache, dass strtol zurückgibt NULL für erfolgreiche Konvertierungen. Wenn jedoch der Wert 55 angegeben wird, schlägt es mit der folgenden Meldung fehl:

./convertToLong 55
Could not convert 55 to long and leftover string is: 55 as long is 55
Nach dem Login kopieren

In diesem Artikel wird untersucht, wie Fehler in strtol korrekt erkannt und das Problem im angegebenen Programm behoben werden.

Fehlerbehandlung in strtol

Die offizielle Spezifikation für strtol (und verwandte Funktionen wie strtoll) besagt dass:

  • Die Eingabezeichenfolge wird in drei Teile aufgeteilt: Leerzeichen, Betreff (Ganzzahl) und nicht erkannte Zeichen.
  • Wenn der Betreff leer oder ungültig ist, findet keine Konvertierung statt, und endptr zeigt auf den Anfang der Eingabezeichenfolge.
  • Wenn der konvertierte Wert außerhalb des darstellbaren Bereichs liegt, wird der entsprechende Mindest- oder Höchstwert zurückgegeben (z. B. LONG_MIN oder LONG_MAX) und errno wird auf ERANGE gesetzt.

Korrigieren des Programms

In C können Fehler von strtol erkannt werden, indem errno auf Null gesetzt wird bevor Sie die Funktion aufrufen. Die modifizierte parseLong-Funktion unten folgt diesem Ansatz:

static long parseLong(const char *str)
{
    errno = 0;
    char *temp;
    long val = strtol(str, &temp, 0);

    if (temp == str || *temp != '<pre class="brush:php;toolbar:false">bool parseLong(const char *str, long *val)
{
    char *temp;
    bool rc = true;
    errno = 0;
    *val = strtol(str, &amp;temp, 0);

    if (temp == str || *temp != '' ||
        ((*val == LONG_MIN || *val == LONG_MAX) &amp;&amp; errno == ERANGE))
        rc = false;

    return rc;
}
Nach dem Login kopieren
' || ((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) fprintf(stderr, "Could not convert '%s' to long and leftover string is: '%s'\n", str, temp); // cerr << "Could not convert '" << str << "' to long and leftover string is '" // << temp << "'\n"; return val; }
  • Wenn die Eingabe leer oder ungültig ist oder nachgestellte Zeichen enthält, gibt sie einen Fehler an stderr aus und gibt 0 oder LONG_MIN/LONG_MAX zurück, wenn der Fehler vorliegt lag an einem Bereichsüberlauf.
  • Wenn keine Fehler aufgetreten sind, wird der konvertierte Wert zurückgegeben Wert.

In C besteht ein flexiblerer Ansatz darin, einen Erfolgs-/Fehlerindikator zurückzugeben und eine separate Funktion zum Extrahieren des konvertierten Werts bereitzustellen:

Fazit

Mit diesen Änderungen behandelt die parseLong-Funktion Fehler von strtol korrekt, sodass Anwendungen den Erfolg oder Misserfolg von ermitteln können Konvertierungen durchführen und Fehler angemessen behandeln.

Das obige ist der detaillierte Inhalt vonWie kann ich Fehler bei der Verwendung von strtol in C und C richtig behandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage