strtol(3)

NAAM
strtol, strtoll, strtoq - converteert een tekenreeks naar een lang geheel getal

BIBLIOTHEEK
Standaard C bibliotheek (libc, -lc)

SAMENVATTING
#include <stdlib.h>

long strtol(const char *restrict nptr,
            char **_Nullable restrict endptr, int base);
long long strtoll(const char *restrict nptr,
            char **_Nullable restrict endptr, int base);

    Feature Test Macro Requirements voor glibc (zie feature_test_macros(7)):

strtoll():
    _ISOC99_SOURCE
        || /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE

BESCHRIJVING
De strtol() functie converteert het initiële deel van een tekenreeks in nptr naar een lang geheel getal met als grondtal als grondtal, welk moet liggen tussen 2 en 36 (inclusief deze grenzen), of de speciale waarde 0.

De tekenreeks mag beginnen met een willekeurig aantal witruimtes (zoals bepaald door isspace(3)) gevolgd door een enkel optioneel teken '+' or '-'. Als het grondtal nul of 16 is, dan mag de string "0x" of "0X" bevatten en wordt het getal gelezen met 16 als grondtal; als het grondtal nul of 2 is, dan mag de string een "0b" or "0B" voorvoegsel bevatten, en het getal wordt gelezen met 2 als grondtal; anders zal het grondtal 0 geïnterpreteerd worden als 10 (decimaal) behalve als het volgende teken '0' is, in welk geval het geïnterpreteerd wordt als 8 (octaal).

De rest van de tekenreeks zal geconverteerd worden naar een long waarde in de voor de hand liggende manier, eindigende bij het eerste ongeldige teken in het gekozen grondtal. (Grondtallen groter dan 10, vertegenwoordigd de letter 'A' in zowel hoofd- als kleine letter 10, 'B' vertegenwoordigd 11, en zo voorts, met 'Z' vertegenwoordigde 35.)

Zodra endptr niet NULL is, zal strtol het adres van het eerste ongeldige teken in *endptr opslaan. Als er geen enkel cijfer was, dan bewaart strtol() de originele waarde van nptr in *endptr (en geeft een 0 terug). In het bijzonder, als *nptr niet gelijk is aan '\0' maar **endptr is '\0' bij terugkeer, dan is de hele tekenreeks geldig.

De strtoll() functie werkt net als de strtol() functie maar geeft een lang-lang gehele waarde terug.

EIND WAARDE
De strtol() functie retourneert het resultaat van een conversie, behalve als de waarde resulteerde in een onder- of overloop. Als een onderloop optrad dan retourneert strtol() een LONG_MIN. Als een overloop optrad dan retourneert strtol() een LONG_MAX. In beide gevallen wordt errno gezet op ERANGE. Hetzelfde geldt voor strtoll() (met LLONG_MIN en LLONG_MAX in plaats van LONG_MIN en LONG_MAX).

FOUTEN
Deze functie verandert errno niet bij succes.

EINVAL
    (niet in C99) Het gegeven grondtal bevat een niet ondersteunde waarde.

ERANGE
    De resulterende waarde was buiten bereik.

De implementatie mag errno zetten op EINVAL in het geval dat er geen omzetting plaats vond (geen cijfers gezien en 0 geretourneerd).

ATTRIBUTEN
Voor een uitleg van de termen zoals gebruikt in deze sectie, zie attributen(7).
Interface | Attribuut | Waarde
strtol(), strtoll(), strtoq() | Thread veilig | MT-Safe taalgebied

VERSIES
Volgens POSIX.1, in taalgebieden anders dan "C" en "POSIX", mogen deze functies andere, implementatie afhankelijke numerieke tekenreeksen accepteren.

BSD heeft ook

    quad_t strtoq(const char *nptr, char **endptr, int grondtal);

met complete vergelijkbare definitie. Afhankelijk van de woordgrootte van de huidige architectuur, kan dit equivalent zijn aan strtoll() of aan strtol().

STANDAARDEN
C23, POSIX.1-2024.

HISTORIE

strtol()
    POSIX.1-2001, C89, SVr4, 4.3BSD.

strtoll()
    POSIX.1-2001, C99.

"0b", "0B"
    C23. glibc 2.38. (Niet in POSIX.)

OPMERKINGEN

  Bereik controles
Omdat strtol() legitiem 0, LONG_MAX, of LONG_MIN (LLONG_MAX of LLONG_MIN voor strtoll()) kan retourneren bij zowel succes of falen, moet het aanroepende programma errno op 0 zetten voor de aanroep, en vervolgens bepalen of een fout optrad door te controleren of errno == ERANGE heeft na de aanroep.

    errno = 0;
    n = strtol(s, &end, base);
    if (end == s)
    	ga naar getal;
    if ((errno == ERANGE && n == _Minof(long)) || n < min)
    	goto te_laag;
    if ((errno == ERANGE && n == _Maxof(long)) || n > max)
    	goto te_hoog;

  basis
Indien base getest moet worden, dan moet dit getest worden in een aanroep waarbij de tekenreeks succesvol zal zijn. Anders is het onmogelijk om in overdraagbare zin de fouten te onderscheiden.

    errno = 0;
    strtol("0", NULL, base);
    if (errno == EINVAL)
        goto unsupported_base;

BUGS

  witruimte
Deze functies accepteren stilzwijgend witruimte voorvoegsels. Om witruimte te weigeren, roep isspace(3) aan voor strtol().

VOORBEELDEN
Het hieronder getoonde programma demonstreert het gebruik van strtol(). Het eerste argument op de commando regel bepaalt de tekenreeks waarvan strtol() het getal moet lezen. Het tweede (optionele) argument bepaalt het grondtal dat moet worden gebruikt voor de conversie. (Dit argument wordt geconverteerd naar een numerieke vorm door gebruik te maken van atoi(3), een functie die niet op fouten controleert en een eenvoudige interface heeft dan strtol().) Een aantal voorbeelden van de resultaten geproduceerd door dit programma zijn de volgende:

    $ ./a.out 123
    strtol() returned 123
    $ ./a.out '    123'
    strtol() returned 123
    $ ./a.out 123abc
    strtol() returned 123
    Further characters after number: "abc"
    $ ./a.out 123abc 55
    strtol: Invalid argument
    $ ./a.out ''
    No digits were found
    $ ./a.out 4000000000
    strtol: Numerical result out of range

  Programma bron
    #include <errno.h>
    #include <stdio.h>
    #include <stdlib.h>

    int
    main(int argc, char *argv[])
    {
        int base;
        char *endptr, *str;
        long val;

        if (argc < 2) {
            fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
            exit(EXIT_FAILURE);
        }

        str = argv[1];
        base = (argc > 2) ? atoi(argv[2]) : 0;

        errno = 0;    /* To distinguish success/failure after call */
        strtol("0", NULL, base);
        if (errno == EINVAL) {
            perror("strtol");
            exit(EXIT_FAILURE);
        }

        errno = 0;    /* To distinguish success/failure after call */
        val = strtol(str, &endptr, base);

        /* Check for various possible errors.  */

        if (errno == ERANGE) {
            perror("strtol");
            exit(EXIT_FAILURE);
        }

        if (endptr == str) {
            fprintf(stderr, "No digits were found\n");
            exit(EXIT_FAILURE);
        }

        /* If we got here, strtol() successfully parsed a number.  */

        printf("strtol() returned %ld\n", val);

        if (*endptr != '\0')        /* Not necessarily an error.  */
            printf("Further characters after number: \"%s\"\n", endptr);

        exit(EXIT_SUCCESS);
    }

ZIE OOK
atof(3), atoi(3), atol(3), strtod(3), strtoimax(3), strtoul(3)

VERTALING
De Nederlandse vertaling van deze handleiding is geschreven door Mario Blättermann <mario.blaettermann@gmail.com> en Luc Castermans <luc.castermans@gmail.com>

Deze vertaling is vrije documentatie; lees de GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) of later over de Copyright-voorwaarden. Er is geen AANSPRAKELIJKHEID.

Indien U fouten in de vertaling van deze handleiding zou vinden, stuur een e-mail naar debian-l10n-dutch@lists.debian.org.