函式
<cstdlib>

strtod

double strtod (const char* str, char** endptr);
將字串轉換為 double
解析 C 字串 str,將其內容解釋為(根據當前區域設定的)浮點數,並返回其 double 型別的值。如果 endptr 不是空指標,該函式還會設定 endptr 的值,使其指向數字之後的第一個字元。

該函式首先丟棄儘可能多的空白字元(如同在 isspace 中),直到找到第一個非空白字元。然後,從這個字元開始,獲取儘可能多的有效字元,這些字元遵循類似於浮點數字面量的語法(見下文),並將其解釋為數值。一個指向最後一個有效字元之後剩餘字串的指標被儲存在 endptr 所指向的物件中。

對於使用 "C" 區域設定的 strtod,一個有效的浮點數由一個可選的符號字元(+-)開頭,後跟一串數字,這串數字可以包含一個小數點(.),並可選地後跟一個指數部分(一個 eE 字元,後跟一個可選的符號和一串數字)。
對於使用 "C" 區域設定的 strtod,一個有效的浮點數由一個可選的符號字元(+-)開頭,後跟以下之一:
- 一串數字,可選地包含一個小數點(.),可選地後跟一個指數部分(一個 eE 字元,後跟一個可選的符號和一串數字)。
- 一個 0x0X 字首,後跟一串十六進位制數字(如同在 isxdigit 中),可選地包含一個分隔整數和小數部分的句點。可選地後跟一個 2 的冪次指數(一個 pP 字元,後跟一個可選的符號和一串十六進位制數字)。
- INFINFINITY(忽略大小寫)。
- NANNAN序列(忽略大小寫),其中序列是一串字元,每個字元要麼是字母數字字元(如同在 isalnum 中),要麼是下劃線字元(_)。

如果 str 中的第一個非空白字元序列不構成剛才描述的有效浮點數,或者如果不存在這樣的序列(因為 str 為空或只包含空白字元),則不執行任何轉換,函式返回一個零值。

引數

str
以浮點數表示形式開頭的 C 字串。
endptr
對一個已分配的 char* 型別物件的引用,其值由函式設定為 str 中數值之後的下一個字元。
此引數也可以是空指標,此時它將不被使用。

返回值

成功時,函式返回轉換後的浮點數,型別為 double
如果無法執行有效的轉換,函式返回零(0.0)。
如果正確的值超出了該型別可表示值的範圍,則返回一個正或負的 HUGE_VAL,並且 errno 被設定為 ERANGE
如果正確的值會導致下溢,函式將返回一個其絕對值不大於最小規格化正數的值,並將 errno 設定為 ERANGE
如果正確的值會導致下溢,函式將返回一個其絕對值不大於最小規格化正數的值(某些庫實現也可能在這種情況下將 errno 設定為 ERANGE)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* strtod example */
#include <stdio.h>      /* printf, NULL */
#include <stdlib.h>     /* strtod */

int main ()
{
  char szOrbits[] = "365.24 29.53";
  char* pEnd;
  double d1, d2;
  d1 = strtod (szOrbits, &pEnd);
  d2 = strtod (pEnd, NULL);
  printf ("The moon completes %.2f orbits per Earth year.\n", d1/d2);
  return 0;
}

輸出

The moon completes 12.37 orbits per Earth year.


資料競爭

str 指向的陣列被訪問,endptr 指向的指標被修改(如果非空)。

異常 (C++)

無異常保證:此函式從不丟擲異常。

如果 str 沒有指向一個有效的 C 字串,或者 endptr 沒有指向一個有效的指標物件,將導致未定義行為

另見