strtol, strtoll
|
Definiert in Header
<stdlib.h>
|
||
|
long
strtol
(
const
char
*
str,
char
**
str_end,
int
base
)
;
|
(bis C99) | |
|
long
strtol
(
const
char
*
restrict
str,
char
**
restrict
str_end,
int
base
)
;
|
(seit C99) | |
|
long
long
strtoll
(
const
char
*
restrict
str,
char
**
restrict
str_end,
int
base
)
;
|
(seit C99) | |
Interpretiert einen ganzzahligen Wert in der Byte-Zeichenkette, auf die von str gezeigt wird.
Verwirft alle Leerzeichen (wie durch Aufruf von
isspace
identifiziert) bis zum ersten Nicht-Leerzeichen, dann nimmt so viele Zeichen wie möglich, um eine gültige
Basis-n
(wobei n=
base
) Ganzzahldarstellung zu bilden und konvertiert sie in einen Ganzzahlwert. Der gültige Ganzzahlwert besteht aus folgenden Teilen:
- (optional) Plus- oder Minuszeichen
-
(optional)
Präfix (
0) zur Kennzeichnung der Oktalbasis (gilt nur, wenn die Basis 8 oder 0 ist) -
(optional)
Präfix (
0xoder0X) zur Kennzeichnung der Hexadezimalbasis (gilt nur, wenn die Basis 16 oder 0 ist) - eine Ziffernfolge
Die Menge der gültigen Werte für die Basis ist
{0, 2, 3, ..., 36}
. Die Menge der gültigen Ziffern für Basis-
2
-Integer ist
{0, 1}
, für Basis-
3
-Integer ist
{0, 1, 2}
und so weiter. Für Basen größer als
10
umfassen gültige Ziffern alphabetische Zeichen, beginnend mit
Aa
für Basis-
11
-Integer bis zu
Zz
für Basis-
36
-Integer. Die Groß-/Kleinschreibung der Zeichen wird ignoriert.
Zusätzliche numerische Formate können von der aktuell installierten C- Locale akzeptiert werden.
Wenn der Wert von
base
0
beträgt, wird die numerische Basis automatisch erkannt: wenn das Präfix
0
lautet, ist die Basis oktal, wenn das Präfix
0x
oder
0X
lautet, ist die Basis hexadezimal, andernfalls ist die Basis dezimal.
Wenn das Minuszeichen Teil der Eingabesequenz war, wird der numerische Wert, der aus der Ziffernfolge berechnet wurde, negiert, als ob durch unary minus im Ergebnistyp.
Die Funktionen setzen den Zeiger, auf den str_end zeigt, so, dass er auf das Zeichen nach dem letzten interpretierten numerischen Zeiger zeigt. Wenn str_end ein Nullzeiger ist, wird er ignoriert.
Wenn die str leer ist oder nicht die erwartete Form hat, wird keine Konvertierung durchgeführt, und (falls str_end kein Nullzeiger ist) wird der Wert von str in dem Objekt gespeichert, auf das str_end zeigt.
Inhaltsverzeichnis |
Parameter
| str | - | Zeiger auf den nullterminierten Byte-String, der interpretiert werden soll |
| str_end | - | Zeiger auf einen Zeiger auf ein Zeichen |
| base | - | base des interpretierten Ganzzahlwerts |
Rückgabewert
- Bei Erfolg wird ein ganzzahliger Wert zurückgegeben, der dem Inhalt von str entspricht.
- Falls der konvertierte Wert außerhalb des Bereichs des entsprechenden Rückgabetyps liegt, tritt ein Bereichsfehler auf (Setzen von errno auf ERANGE ) und es wird LONG_MAX , LONG_MIN , LLONG_MAX oder LLONG_MIN zurückgegeben.
- Falls keine Konvertierung durchgeführt werden kann, wird 0 zurückgegeben.
Beispiel
#include <errno.h> #include <limits.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> int main(void) { // Parsen mit Fehlerbehandlung const char* p = "10 200000000000000000000000000000 30 -40 junk"; printf("Parsing '%s':\n", p); for (;;) { // errno kann durch einen Bibliotheksfunktionsaufruf auf jeden Wert ungleich Null gesetzt werden // unabhängig davon, ob ein Fehler aufgetreten ist, daher muss es zurückgesetzt werden // um den von strtol gesetzten Fehler zu überprüfen errno = 0; char* end; const long i = strtol(p, &end, 10); if (p == end) break; const bool range_error = errno == ERANGE; printf("Extracted '%.*s', strtol returned %ld.", (int)(end-p), p, i); p = end; if (range_error) printf("\n --> Range error occurred."); putchar('\n'); } printf("Unextracted leftover: '%s'\n\n", p); // Parsen ohne Fehlerbehandlung printf("\"1010\" in binary --> %ld\n", strtol("1010", NULL, 2)); printf("\"12\" in octal --> %ld\n", strtol("12", NULL, 8)); printf("\"A\" in hex --> %ld\n", strtol("A", NULL, 16)); printf("\"junk\" in base-36 --> %ld\n", strtol("junk", NULL, 36)); printf("\"012\" in auto-detected base --> %ld\n", strtol("012", NULL, 0)); printf("\"0xA\" in auto-detected base --> %ld\n", strtol("0xA", NULL, 0)); printf("\"junk\" in auto-detected base --> %ld\n", strtol("junk", NULL, 0)); }
Mögliche Ausgabe:
Parsing '10 200000000000000000000000000000 30 -40 junk': Extracted '10', strtol returned 10. Extracted ' 200000000000000000000000000000', strtol returned 9223372036854775807. --> Range error occurred. Extracted ' 30', strtol returned 30. Extracted ' -40', strtol returned -40. Unextracted leftover: ' junk' "1010" in binary --> 10 "12" in octal --> 10 "A" in hex --> 10 "junk" in base-36 --> 926192 "012" in auto-detected base --> 10 "0xA" in auto-detected base --> 10 "junk" in auto-detected base --> 0
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 7.22.1.4 Die Funktionen strtol, strtoll, strtoul und strtoull (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.22.1.4 Die Funktionen strtol, strtoll, strtoul und strtoull (S: 251-252)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.22.1.4 Die Funktionen strtol, strtoll, strtoul und strtoull (S: 344-345)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.20.1.4 Die Funktionen strtol, strtoll, strtoul und strtoull (S: 310-311)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.10.1.5 Die strtol-Funktion
Siehe auch
|
(C99)
|
wandelt eine Byte-Zeichenkette in einen ganzzahligen Wert um
(Funktion) |
|
(C99)
|
wandelt eine Byte-Zeichenkette in einen vorzeichenlosen ganzzahligen Wert um
(Funktion) |
|
(C95)
(C99)
|
wandelt eine Breitzeichen-Zeichenkette in einen ganzzahligen Wert um
(Funktion) |
|
(C95)
(C99)
|
wandelt eine Breitzeichen-Zeichenkette in einen vorzeichenlosen ganzzahligen Wert um
(Funktion) |
|
C++-Dokumentation
für
strtol
,
strtoll
|
|