HOWTO · C

So konvertieren Sie einen String in eine Ganzzahl in C

Dieser Artikel stellt verschiedene Methoden in C vor, um eine Zeichenkette in eine ganze Zahl zu konvertieren

Auf dieser Seite

Eine C-Zeichenkette in eine Ganzzahl umzuwandeln, hängt davon ab, welche Eingaben Sie akzeptieren und welche Prüfungen Ihr Programm benötigt. Die Standardbibliothek stellt atoi(), strtol() und strtoumax() bereit. Verwenden Sie atoi() nur bei bereits vertrauenswürdigen Eingaben. Bei Eingaben, die fehlerhaft sein oder außerhalb des Wertebereichs des Zieltyps liegen können, ist eine geprüfte Umwandlung mit strtol() oder strtoumax() vorzuziehen.

atoi() verwenden, um eine Zeichenkette in C in eine Ganzzahl umzuwandeln

atoi() aus <stdlib.h> überspringt führende Leerzeichen, liest ein optionales Vorzeichen und Dezimalziffern und hält dann beim ersten Zeichen an, das nicht zur Zahl gehört. Die Funktion gibt einen int zurück, aber ihre Schnittstelle meldet weder, an welcher Stelle das Einlesen endete, noch unterscheidet sie eine gültige Null von einer fehlgeschlagenen Umwandlung. Lässt sich der umgewandelte Wert nicht als int darstellen, ist das Verhalten undefiniert. Verwenden Sie die Funktion nur, wenn Eingabeformat und Wertebereich anderweitig gewährleistet sind.

Führen Sie dieses Beispiel aus. Der Code bleibt unverändert; in diesem Beispiel enthält die Ausgabe keine englische Bezeichnung:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    const char *input = "123";
    int value = atoi(input);
    printf("%s -> %d\n", input, value);
    return 0;
}

Beobachtete Ausgabe:

123 -> 123

strtol() verwenden, um eine Zeichenkette in C in eine Ganzzahl umzuwandeln

strtol() ist in <stdlib.h> deklariert und gibt einen long zurück. Die Funktion akzeptiert eine Basis von 2 bis 36: Bei Basis 10 wird eine Dezimalzahl gelesen, während Basis 0 die üblichen C-Präfixe für Ganzzahlen erkennt. Führende Leerzeichen werden übersprungen; beim ersten Zeichen, das nicht zur Zahl gehört, endet das Einlesen. Übergeben Sie die Adresse eines Endzeigers, um diese Stelle zu ermitteln. Zeigt der Endzeiger weiterhin auf das erste Zeichen der Eingabe, wurde keine Ziffer umgewandelt. Zeigt er nach der Umwandlung auf ein Zeichen ungleich null, enthält die Eingabe einen nachgestellten Rest.

Setzen Sie errno vor dem Aufruf von strtol() auf null. Ein Ergebnis von LONG_MIN oder LONG_MAX zusammen mit errno == ERANGE zeigt an, dass der Wert außerhalb des long-Wertebereichs lag. Ist der Zieltyp int, prüfen Sie vor der Typumwandlung außerdem, ob der Wert zwischen INT_MIN und INT_MAX liegt. Dieses vollständige Beispiel akzeptiert nur eine vollständige Dezimalzahl, die in einen int passt. Der Code bleibt unverändert; die englische Ausgabebezeichnung value= wird hier mit dem Zahlenwert ausgegeben:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    const char *input = "123";
    char *end;
    errno = 0;
    long parsed = strtol(input, &end, 10);

    if (end == input || *end != '\0' || errno == ERANGE ||
        parsed < INT_MIN || parsed > INT_MAX) {
        puts("conversion failed");
        return 0;
    }

    printf("value=%d\n", (int)parsed);
    return 0;
}

Beobachtete Ausgabe:

value=123

Legen Sie für produktiven Code fest, ob Leerzeichen am Anfang oder Ende sowie nachgestellte Zeichen zulässig sind. strtol() selbst erlaubt führende Leerzeichen; die Prüfung des Endzeigers oben weist alle Zeichen zurück, die auf die Ziffern folgen.

strtoumax() verwenden, um eine Zeichenkette in C in eine Ganzzahl umzuwandeln

strtoumax() ist in <inttypes.h> deklariert und wandelt in uintmax_t um, den breitesten von der Implementierung bereitgestellten vorzeichenlosen Ganzzahltyp. Wie strtol() verwendet die Funktion einen Endzeiger und eine Basis. Einen Wertebereichsüberlauf meldet sie über errno == ERANGE, nachdem errno zuvor zurückgesetzt wurde. Binden Sie <stdint.h> für den Typ uintmax_t und <inttypes.h> für die Funktion und das Formatierungs-Makro PRIuMAX ein.

Eine vorzeichenlose Umwandlung kann ein führendes Minuszeichen akzeptieren und gemäß den Regeln der Funktion einen vorzeichenlosen Wert ergeben. Verlangt die Anwendung eine nichtnegative Eingabe, weisen Sie ein Minuszeichen ausdrücklich zurück. Das folgende Beispiel verlangt außerdem mindestens eine Ziffer, weist nachgestellte Zeichen zurück und gibt den Wert mit dem passenden Formatierungs-Makro aus. Der Code bleibt unverändert; die englische Ausgabebezeichnung value= wird zusammen mit dem Zahlenwert angezeigt:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

#include <ctype.h>
#include <errno.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    const char *input = "123";
    const char *sign = input;
    while (isspace((unsigned char)*sign)) {
        ++sign;
    }

    if (*sign == '-') {
        puts("conversion failed");
        return 0;
    }

    char *end;
    errno = 0;
    uintmax_t value = strtoumax(input, &end, 10);
    if (end == input || *end != '\0' || errno == ERANGE) {
        puts("conversion failed");
        return 0;
    }

    printf("value=%" PRIuMAX "\n", value);
    return 0;
}

Beobachtete Ausgabe:

value=123

Der Ergebnistyp ist vorzeichenlos und kann einen größeren Wertebereich als int haben. Prüfen Sie den Wert anhand des Höchstwerts des Zieltyps, bevor Sie ihn in einen schmaleren Typ umwandeln.

Eine C-Funktion zur Umwandlung von Zeichenketten in Ganzzahlen auswählen

Wählen Sie atoi(), wenn die Eingabe vertrauenswürdig ist, in einen int passt und das Programm eine fehlerhafte Eingabe nicht von null unterscheiden muss. Für Benutzereingaben, Dateien und andere Daten, die vom erwarteten Format abweichen können, ist strtol() im Allgemeinen die bessere vorzeichenbehaftete Umwandlungsfunktion, da Endzeiger und errno eine Validierung ermöglichen. Prüfen Sie sowohl den long-Wertebereich als auch den Wertebereich jedes schmaleren Zieltyps.

Wählen Sie strtoumax() für eine nichtnegative Größe, die den positiven Wertebereich von long überschreiten kann. Prüfen Sie, ob Ziffern eingelesen wurden, weisen Sie nachgestellten Text zurück, wenn die gesamte Zeichenkette numerisch sein muss, prüfen Sie ERANGE und setzen Sie gegebenenfalls engere anwendungsspezifische Grenzen durch. Keine der beiden geprüften Funktionen entscheidet, welche Eingaben Ihre Anwendung akzeptiert. Der aufrufende Code muss festlegen, ob Leerzeichen, Vorzeichen, Präfixe oder nachgestellte Zeichen zulässig sind, und diese Regeln prüfen, bevor er das Ergebnis verwendet.