strtol, strtoll
| Definiert im 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 einer Byte-Zeichenkette, auf die von str gezeigt wird.
Verwirft alle Whitespace-Zeichen (wie durch den Aufruf von isspace identifiziert) bis zum ersten Nicht-Whitespace-Zeichen. Dann werden so viele Zeichen wie möglich aufgenommen, um eine gültige *Basis-n*- (wobei n=base) Ganzzahl-Darstellung zu bilden und diese in einen ganzzahligen Wert umzuwandeln. Der gültige ganzzahlige Wert besteht aus den folgenden Teilen
- (optional) Vorzeichen (+ oder -)
- (optional) Präfix (
0), das die Oktalbasis angibt (gilt nur, wenn die Basis 8 oder 0 ist) - (optional) Präfix (
0xoder0X), das die Hexadezimalbasis angibt (gilt nur, wenn die Basis 16 oder 0 ist) - eine Folge von Ziffern
Die Menge der gültigen Werte für base ist {0, 2, 3, ..., 36}. Die Menge der gültigen Ziffern für Basis-2-Ganzzahlen ist {0, 1}, für Basis-3-Ganzzahlen 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-Ganzzahlen bis Zz für Basis-36-Ganzzahlen. Die Groß-/Kleinschreibung der Zeichen wird ignoriert.
Zusätzliche numerische Formate können durch die aktuell installierte C-Locale akzeptiert werden.
Wenn der Wert von base 0 ist, wird die numerische Basis automatisch erkannt: Wenn das Präfix 0 ist, ist die Basis Oktal, wenn das Präfix 0x oder 0X ist, ist die Basis Hexadezimal, ansonsten ist die Basis Dezimal.
Wenn das Minuszeichen Teil der Eingabesequenz war, wird der aus der Ziffernsequenz berechnete numerische Wert negiert, als ob durch unäres Minus im Ergebnistyp.
Die Funktionen setzen den Zeiger, auf den von str_end gezeigt wird, so, dass er auf das Zeichen nach dem letzten interpretierten numerischen Zeichen zeigt. Wenn str_end ein Nullzeiger ist, wird er ignoriert.
Wenn str leer ist oder nicht die erwartete Form hat, wird keine Konvertierung durchgeführt, und (wenn str_end kein Nullzeiger ist) wird der Wert von str in das Objekt gespeichert, auf das von str_end gezeigt wird.
Inhalt |
[edit] Parameter
| str | - | Zeiger auf die nullterminierte Byte-Zeichenkette, die interpretiert werden soll |
| str_end | - | Zeiger auf einen Zeiger auf ein Zeichen |
| base | - | Basis des interpretierten Ganzzahlwerts |
[edit] Rückgabewert
- Bei Erfolg wird ein ganzzahliger Wert zurückgegeben, der dem Inhalt von str entspricht.
- Wenn der konvertierte Wert außerhalb des Bereichs des entsprechenden Rückgabetyps liegt, tritt ein Bereichsfehler auf (setzt errno auf ERANGE) und LONG_MAX, LONG_MIN, LLONG_MAX oder LLONG_MIN wird zurückgegeben.
- Wenn keine Konvertierung durchgeführt werden kann, wird 0 zurückgegeben.
[edit] Beispiel
#include <errno.h> #include <limits.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> int main(void) { // parsing with error handling const char* p = "10 200000000000000000000000000000 30 -40 junk"; printf("Parsing '%s':\n", p); for (;;) { // errno can be set to any non-zero value by a library function call // regardless of whether there was an error, so it needs to be cleared // in order to check the error set by strtol 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); // parsing without error handling 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
[edit] 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 Funktion strtol
[edit] Siehe auch
| (C99) |
konvertiert einen Byte-String in einen Ganzzahlwert (Funktion) |
| (C99) |
konvertiert einen Byte-String in einen vorzeichenlosen Ganzzahlwert (Funktion) |
| (C95)(C99) |
wandelt eine breite Zeichenkette in einen ganzzahligen Wert um (Funktion) |
| (C95)(C99) |
wandelt eine breite Zeichenkette in einen vorzeichenlosen ganzzahligen Wert um (Funktion) |
| C++ Dokumentation für strtol, strtoll
| |