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
aufERANGE
festgelegt, wenn ein Überlauf oder Unterlauf auftritt. - Wenn ungültige Parameter vorhanden sind, wird festgelegt
EINVAL
,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_errlist
und _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. Wie Sie dieses Verhalten ändern, erfahren Sie unter Globaler Status in der CRT.
Mapping generischer Textroutinen
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 endptr
die 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
] {digits
[radix
digits
] | radix
digits
}sign
[{e
| E
} [sign
] digits
]
[] [whitespace
] {0x
sign
0X
| } {hexdigits
[radix
hexdigits
] | } radix
hexdigits
[{p
| P
} [sign
] digits
]
[] [] [whitespace
] {INF
| INFINITY
}sign
[] [] [whitespace
] [sign
sequence
] NAN
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 Unterstützung und Gleitkommaunterstützung
Interpretation von Multibytezeichensequenzen
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