Bagikan melalui


strtod, _strtod_l, wcstod, _wcstod_l

Mengonversi string menjadi nilai presisi ganda.

Sintaks

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
String yang dihentikan null untuk dikonversi.

endptr
Penunjuk ke karakter yang menghentikan pemindaian.

locale
Lokal yang akan digunakan.

Nilai hasil

strtod mengembalikan nilai angka floating-point, kecuali ketika representasi akan menyebabkan luapan, dalam hal ini fungsi mengembalikan +/-HUGE_VAL. Tanda HUGE_VAL cocok dengan tanda nilai yang tidak dapat diwakili. strtod0 mengembalikan jika tidak ada konversi yang dapat dilakukan atau terjadi aliran bawah.

wcstod mengembalikan nilai secara analog ke strtod:

  • Untuk kedua fungsi, errno diatur ke ERANGE jika luapan atau aliran bawah terjadi.
  • Jika ada parameter yang tidak valid, errno diatur ke EINVAL dan handler parameter yang tidak valid dipanggil, seperti yang dijelaskan dalam Validasi parameter.

Untuk informasi selengkapnya tentang kode pengembalian ini dan lainnya, lihat errno, , _doserrno_sys_errlist, dan _sys_nerr.

Keterangan

Setiap fungsi mengonversi string strSource input menjadi double. Fungsi ini strtod dikonversi strSource ke nilai presisi ganda. strtod berhenti membaca string strSource pada karakter pertama yang tidak dapat dikenali sebagai bagian dari angka. Karakter ini mungkin karakter null yang mengakhiri. wcstod adalah versi karakter luas dari strtod; argumennya strSource adalah string karakter lebar. Fungsi-fungsi ini berulah secara identik jika tidak.

Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.

Pemetaan rutin teks generik

TCHAR.H Rutin _UNICODE dan _MBCS tidak ditentukan _MBCS Didefinisikan _UNICODE Didefinisikan
_tcstod strtod strtod wcstod
_tcstod_l _strtod_l _strtod_l _wcstod_l

Pengaturan LC_NUMERIC kategori lokal saat ini menentukan pengenalan karakter titik radix di strSource. Untuk informasi selengkapnya, lihat setlocale . Fungsi tanpa akhiran _l menggunakan lokal saat ini; _strtod_l identik dengan _strtod kecuali yang pertama menggunakan yang locale diteruskan sebagai gantinya. Untuk informasi selengkapnya, lihat Lokal.

Jika endptr bukan , penunjuk NULLke karakter yang menghentikan pemindaian disimpan di lokasi yang ditujukkan oleh endptr. Jika tidak ada konversi yang dapat dilakukan (tidak ada digit yang valid yang ditemukan atau basis yang tidak valid ditentukan), nilai strSource disimpan di lokasi yang ditunjukkan oleh endptr.

strtodstrSource mengharapkan untuk menunjuk ke string salah satu formulir berikut:

[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]

Di depan whitespace opsional dapat terdiri dari karakter spasi dan tab, yang diabaikan.
sign adalah plus (+) atau minus (-).
digits adalah satu atau beberapa digit desimal.
hexdigits adalah satu atau beberapa digit heksadesimal.
radix adalah karakter titik radiks, baik titik (.) di lokal "C" default, atau nilai khusus lokal jika lokal saat ini berbeda atau ketika locale ditentukan.
sequence adalah urutan karakter alfanumerik atau garis bawah.

Dalam bentuk angka desimal dan heksadesimal, jika tidak ada digit yang muncul sebelum karakter titik radiks, setidaknya satu harus muncul setelah karakter titik radix.

Dalam bentuk desimal, digit desimal dapat diikuti oleh eksponen, yang terdiri dari huruf pengantar (e atau E) dan bilangan bulat yang ditandatangani secara opsional.

Dalam bentuk heksadesimal, digit heksadesimal dapat diikuti oleh eksponen, yang terdiri dari huruf pengantar (p atau P) dan bilangan bulat desimal yang ditandatangani secara opsional yang mewakili eksponen sebagai kekuatan 2.

Dalam salah satu bentuk, jika tidak ada bagian eksponen atau karakter titik radiks, karakter titik radiks diasumsikan untuk mengikuti digit terakhir dalam string.

Kasus diabaikan dalam INF formulir dan NAN . Karakter pertama yang tidak cocok dengan salah satu bentuk ini menghentikan pemindaian.

Versi UCRT dari fungsi-fungsi ini tidak mendukung konversi huruf eksponen gaya Fortran (d atau D) . Ekstensi non-standar ini didukung oleh versi CRT yang lebih lama, dan mungkin merupakan perubahan yang melanggar untuk kode Anda. Versi UCRT mendukung string heksadesimal dan round-tripping dan INFNAN nilai, yang tidak didukung dalam versi sebelumnya. Dukungan ini juga dapat menyebabkan perubahan yang melanggar dalam kode Anda. Misalnya, string "0x1a" akan ditafsirkan oleh strtod sebagai 0.0 di versi sebelumnya, tetapi sebagai 26.0 dalam versi UCRT.

Persyaratan

Rutin Header yang diperlukan
strtod, _strtod_l C: <stdlib.h> C++: <cstdlib> atau <stdlib.h>
wcstod, _wcstod_l C: <stdlib.h> atau <wchar.h> C++: <cstdlib>, <stdlib.h>, atau <wchar.h>

Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.

Contoh

// 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

Baca juga

Konversi data
Dukungan matematika dan titik mengambang
Interpretasi urutan karakter multibyte
Lokal
String ke fungsi nilai numerik
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