strtod, _strtod_l, wcstod, _wcstod_l

Konvertieren von Zeichenfolgen in einen Wert mit doppelter Genauigkeit

Syntax

double strtod(
   const char *strSource,
   char **endptr
);
double _strtod_l(
   const char *strSource,
   char **endptr,
   _locale_t locale
);
double wcstod(
   const wchar_t *strSource,
   wchar_t **endptr
);
double _wcstod_l(
   const wchar_t *strSource,
   wchar_t **endptr,
   _locale_t locale
);

Parameter

strSource
Zu konvertierende mit NULL endende Zeichenfolge.

endptr
Zeiger auf ein Zeichen, mit dem die Überprüfung beendet wird.

locale
Das zu verwendende Gebietsschema.

Rückgabewert

strtod gibt den Wert der Gleitkommazahl zurück, außer wenn die Darstellung einen Überlauf verursachen würde, in diesem Fall gibt die Funktion +/-zurückHUGE_VAL. Das Vorzeichen entspricht HUGE_VAL dem Vorzeichen des Werts, der nicht dargestellt werden kann. strtod gibt zurück 0 , wenn keine Konvertierung ausgeführt werden kann oder ein Unterlauf auftritt.

wcstod gibt Werte analog zu strtod:

  • Für beide Funktionen wird errno auf ERANGE festgelegt, wenn ein Überlauf oder Unterlauf auftritt.
  • Wenn ungültige Parameter vorhanden sind, wird festgelegtEINVAL, errno und der ungültige Parameterhandler wird aufgerufen, wie in der Parameterüberprüfung beschrieben.

Weitere Informationen zu diesem und anderen Rückgabecodes finden Sie unter , , _doserrno, _sys_errlistund _sys_nerr.errno

Hinweise

Jede Funktion wandelt die Eingabezeichenfolge strSource in einen double-Wert um. Die strtod-Funktion konvertiert strSource in einen Wert mit doppelter Genauigkeit. strtod beendet das Lesen der Zeichenfolge strSource am ersten Zeichen, das nicht als Teil einer Zahl erkannt werden kann. Dieses Zeichen kann das endende Nullzeichen sein. wcstod ist eine Breitzeichenversion von strtod. Das dazugehörige strSource-Argument ist eine Breitzeichenfolge. Anderenfalls verhalten sich diese Funktionen identisch.

Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Informationen zum Ändern dieses Verhaltens finden Sie im Global state in the CRT.

Generische Textroutinzuordnungen

TCHAR.H Routine _UNICODE und _MBCS nicht definiert _MBCS Definiert _UNICODE Definiert
_tcstod strtod strtod wcstod
_tcstod_l _strtod_l _strtod_l _wcstod_l

Die LC_NUMERIC Kategorieeinstellung des aktuellen Gebietsschemas bestimmt die Erkennung des Radixpunktzeichens in strSource. Weitere Informationen finden Sie unter setlocale. Die Funktionen ohne das _l Suffix verwenden das aktuelle Gebietsschema; _strtod_l ist identisch mit _strtod der Ausnahme, dass der locale frühere das übergebene Element verwendet. Weitere Informationen finden Sie unter Locale.

Wenn endptr nicht NULL, wird ein Zeiger auf das Zeichen, das den Scan beendet hat, an der Stelle gespeichert, auf endptrdie verwiesen wird. Wenn keine Konvertierung ausgeführt werden kann (keine gültigen Ziffern gefunden oder ungültige Basis angegeben), wird der Wert von strSource an dem Speicherort gespeichert, auf den durch endptr gezeigt wird.

strtod erwartet, strSource dass sie auf eine Zeichenfolge aus einer der folgenden Formen verweist:

[whitespace] [sign] {digits [radixdigits] | radixdigits} [{e | E} [sign] digits]
[whitespace] [sign] {0x | 0X} {hexdigits [radixhexdigits] | radixhexdigits} [{p | P} [sign] digits]
[whitespace] [sign] {INF | INFINITY}
[whitespace] [sign] NAN [sequence]

Die optionale Führende whitespace kann aus Leerzeichen und Tabstoppzeichen bestehen, die ignoriert werden.
sign ist entweder Pluszeichen (+) oder Minuszeichen (-).
digits sind eine oder mehrere Dezimalziffern.
hexdigits sind eine oder mehrere Hexadezimalziffern.
radix ist das Radixpunktzeichen, entweder ein Punkt (.) im Standardgebietsschema "C" oder der gebietsschemaspezifische Wert, wenn das aktuelle Gebietsschema anders ist oder wenn locale angegeben wird.
A sequence ist eine Sequenz von alphanumerischen oder Unterstrichzeichen.

In Form von Dezimal- und Hexadezimalzahlen muss mindestens ein Zeichen nach dem Radixpunktzeichen angezeigt werden, wenn keine Ziffern vor dem Radixpunktzeichen angezeigt werden.

In dezimaler Form können die Dezimalziffern durch einen Exponenten gefolgt werden, der aus einem einführungsschreiben (e oder E) und einer optional signierten ganzzahligen Zahl besteht.

In der hexadezimalen Form können die Hexadezimalziffern durch einen Exponenten gefolgt werden, der aus einem einführenden Buchstaben (p oder P) und einer optional signierten Dezimalzahl besteht, die den Exponenten als Potenz von 2 darstellt.

Wenn in beiden Formen kein exponentischer Teil oder ein Radixpunktzeichen vorhanden ist, wird angenommen, dass ein Radixpunktzeichen der letzten Ziffer in der Zeichenfolge folgt.

Der Fall wird sowohl in den Formularen NAN als auch in den INF Formularen ignoriert. Das erste Zeichen, das nicht zu einem dieser Formulare passt, beendet den Scan.

Die UCRT-Versionen dieser Funktionen unterstützen keine Konvertierung von Fortran-Formaten (d oder D) Exponentenbuchstaben. Diese nicht-standardmäßige Erweiterung wurde in früheren Versionen des CRT unterstützt. Sie ist möglicherweise eine unterbrechende Änderung für Ihren Code. Die UCRT-Versionen unterstützen hexadezimale Zeichenfolgen und Roundtripping von INF werten NAN , die in früheren Versionen nicht unterstützt wurden. Diese Unterstützung kann auch zu fehlerhaften Änderungen in Ihrem Code führen. Beispielsweise würde die Zeichenfolge "0x1a" in früheren Versionen als strtod 0.0 interpretiert, aber als 26.0 in der UCRT-Version.

Anforderungen

Routine Erforderlicher Header
strtod, _strtod_l C: C++: <stdlib.h><cstdlib> oder <stdlib.h>
wcstod, _wcstod_l C: oder <wchar.h> C++: <cstdlib><stdlib.h> , , <stdlib.h>oder<wchar.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

// crt_strtod.c
// This program uses strtod to convert a
// string to a double-precision value; strtol to
// convert a string to long integer values; and strtoul
// to convert a string to unsigned long-integer values.
//

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

int main(void)
{
    char *string, *stopstring;
    double x;
    long   l;
    int    base;
    unsigned long ul;

    string = "3.1415926This stopped it";
    x = strtod(string, &stopstring);
    printf("string = %s\n", string);
    printf("   strtod = %f\n", x);
    printf("   Stopped scan at: %s\n\n", stopstring);

    string = "-10110134932This stopped it";
    l = strtol(string, &stopstring, 10);
    printf("string = %s\n", string);
    printf("   strtol = %ld\n", l);
    printf("   Stopped scan at: %s\n\n", stopstring);

    string = "10110134932";
    printf("string = %s\n", string);

    // Convert string using base 2, 4, and 8:
    for (base = 2; base <= 8; base *= 2)
    {
        // Convert the string:
        ul = strtoul(string, &stopstring, base);
        printf("   strtol = %ld (base %d)\n", ul, base);
        printf("   Stopped scan at: %s\n", stopstring);
    }

    // NaN
    x = strtod("+nan", &stopstring);
    printf("\n%f\n", x);

    // INF
    x = strtod("-INF", &stopstring);
    printf("\n%f\n", x);

    // e - exponent
    x = strtod("1.18973e+49", &stopstring);
    printf("\n%f\n", x);

    // doesn't handle Fortran style
    x = strtod("1.18973d+49", &stopstring);
    printf("\n%f\n", x);
    printf("No Fortran style support. Stopped parsing at %s\n", stopstring);
}
string = 3.1415926This stopped it
   strtod = 3.141593
   Stopped scan at: This stopped it

string = -10110134932This stopped it
   strtol = -2147483648
   Stopped scan at: This stopped it

string = 10110134932
   strtol = 45 (base 2)
   Stopped scan at: 34932
   strtol = 4423 (base 4)
   Stopped scan at: 4932
   strtol = 2134108 (base 8)
   Stopped scan at: 932

nan

-inf

11897299999999999421285862642874618947301378359296.000000

1.189730
No Fortran style support. Stopped parsing at d+49

Siehe auch

Datenkonvertierung
Mathematische und Gleitkommaunterstützung
Interpretation von Multibyte-Zeichensequenzen
Gebietsschema
Zeichenfolge zu numerischen Wertfunktionen
strtol, wcstol, _strtol_l, _wcstol_l
strtoul, _strtoul_l, wcstoul, _wcstoul_l
atof, _atof_l, _wtof, _wtof_l
localeconv
_create_locale, _wcreate_locale
_free_locale