Namensräume
Varianten
Aktionen

strtof, strtod, strtold

Von cppreference.com
< c‎ | string‎ | byte
Definiert im Header <stdlib.h>
float       strtof ( const char* restrict str, char** restrict str_end );
(1) (seit C99)
(2)
double      strtod ( const char*          str, char**          str_end );
(bis C99)
double      strtod ( const char* restrict str, char** restrict str_end );
(seit C99)
long double strtold( const char* restrict str, char** restrict str_end );
(3) (seit C99)

Interpretiert einen Fließkommawert in einem von str zeigenden Byte-String.

Die Funktion verwirft alle Leerzeichen (wie von isspace bestimmt), bis das erste Nicht-Leerzeichen gefunden wird. Dann nimmt sie so viele Zeichen wie möglich auf, um eine gültige Fließkommadarstellung zu bilden, und konvertiert sie in einen Fließkommawert. Der gültige Fließkommawert kann einer der folgenden sein:

  • Dezimale Gleitkomma-Ausdrücke. Sie bestehen aus den folgenden Teilen:
  • (optional) Vorzeichen (+ oder -)
  • nicht-leere Folge von Dezimalziffern, die optional ein Dezimalpunktzeichen enthält (wie von der aktuellen C Locale bestimmt) (definiert den Signifikand)
  • (optional) e oder E gefolgt von einem optionalen Minus- oder Pluszeichen und einer nichtleeren Sequenz von Dezimalziffern (definiert den Exponenten zur Basis 10)
  • Hexadezimale Gleitkomma-Ausdrücke. Sie bestehen aus den folgenden Teilen:
  • (optional) Vorzeichen (+ oder -)
  • 0x oder 0X
  • nicht-leere Folge von Hexadezimalziffern, die optional ein Dezimalpunktzeichen enthält (wie von der aktuellen C Locale bestimmt) (definiert den Signifikand)
  • (optional) p oder P gefolgt von einem optionalen Minus- oder Pluszeichen und einer nichtleeren Sequenz von Dezimalziffern (definiert den Exponenten zur Basis 2)
  • Unendlichkeits-Ausdrücke. Sie bestehen aus den folgenden Teilen:
  • (optional) Vorzeichen (+ oder -)
  • INF oder INFINITY (Groß-/Kleinschreibung wird ignoriert)
  • Nicht-eine-Zahl-Ausdrücke. Sie bestehen aus den folgenden Teilen:
  • (optional) Vorzeichen (+ oder -)
  • NAN oder NAN(char_sequence ) (Groß-/Kleinschreibung des Teils NAN wird ignoriert). char_sequence darf nur Ziffern, lateinische Buchstaben und Unterstriche enthalten. Das Ergebnis ist ein Quiet-NaN-Gleitkommawert.
(seit C99)
  • jeder andere Ausdruck, der von der aktuell installierten C Locale akzeptiert werden kann.

Die Funktion setzt den von str_end zeigenden Zeiger so, dass er auf das Zeichen nach dem letzten interpretierten Zeichen zeigt. Wenn str_end ein Nullzeiger ist, wird er ignoriert.

Inhalt

[bearbeiten] Parameter

str - Zeiger auf die nullterminierte Byte-Zeichenkette, die interpretiert werden soll
str_end - Zeiger auf einen Zeiger auf ein Zeichen

[bearbeiten] Rückgabewert

Fließkommawert, der bei Erfolg dem Inhalt von str entspricht. Wenn der konvertierte Wert außerhalb des Bereichs des entsprechenden Rückgabetyps liegt, tritt ein Bereichsfehler auf (errno wird auf ERANGE gesetzt) und HUGE_VAL, HUGE_VALF oder HUGE_VALL wird zurückgegeben. Wenn keine Konvertierung durchgeführt werden kann, wird 0 zurückgegeben.

[bearbeiten] Beispiel

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    // parsing with error handling
    const char* p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz";
    printf("Parsing '%s':\n", p);
    char* end = NULL;
    for (double f = strtod(p, &end); p != end; f = strtod(p, &end))
    {
        printf("'%.*s' -> ", (int)(end - p), p);
        p = end;
        if (errno == ERANGE)
        {
            printf("range error, got ");
            errno = 0;
        }
        printf("%f\n", f);
    }
 
    // parsing without error handling
    printf("\"  -0.0000000123junk\"  -->  %g\n", strtod("  -0.0000000123junk", NULL));
    printf("\"junk\"                 -->  %g\n", strtod("junk", NULL));
}

Mögliche Ausgabe

Parsing '111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz':
'111.11' -> 111.110000
' -2.22' -> -2.220000
' Nan' -> nan
' nan(2)' -> nan
' inF' -> inf
' 0X1.BC70A3D70A3D7P+6' -> 111.110000
'  1.18973e+4932' -> range error, got inf
"  -0.0000000123junk"  -->  -1.23e-08
"junk"                 -->  0

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.22.1.3 Die Funktionen strtod, strtof und strtold (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.22.1.3 Die Funktionen strtod, strtof und strtold (S. 249-251)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.22.1.3 Die Funktionen strtod, strtof und strtold (S. 342-344)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.20.1.3 Die Funktionen strtod, strtof und strtold (S. 308-310)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.10.1.4 Die Funktion strtod

[bearbeiten] Siehe auch

konvertiert einen Byte-String in einen Gleitkommawert
(Funktion) [bearbeiten]
(C99)(C95)(C99)
wandelt eine breite Zeichenkette in einen Fließkommawert um
(Funktion) [bearbeiten]
C++ Dokumentation für strtof, strtod, strtold