C++ 中的strtod() 函數將字符串的內容解釋為浮點數並將其值作為雙精度值返回。
該函數還設置一個指針,指向字符串的最後一個有效字符之後的第一個字符(如果有),否則該指針設置為空。
對於基數 10 和字符串 "12abc"
有效數字部分 -> 12
有效數字部分後的第一個字符 -> a
它在<cstdlib> 頭文件中定義。
strtod()原型
double strtod(const char* str, char** end);
strtod() 函數將字符串和指向字符的指針作為其參數,將字符串的內容解釋為 float
數字並返回 double
值。
參數:
- str:具有浮點數表示的字符串。
- end: 對已分配的 char* 類型對象的引用。 end 的值由函數設置為 str 中最後一個有效字符之後的下一個字符。該參數也可以是空指針,在這種情況下不使用。
返回:
strtod() 函數返回:
- 一個雙精度值(從字符串轉換而來)。
- 如果無法執行有效轉換,則為 0.0。
如果轉換後的值超出範圍,則會發生範圍錯誤並返回正數或負數HUGE_VAL。
示例 1:strtod() 函數如何工作?
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
char numberString[] = "12.44b 0xy";
char *end;
double number;
number = strtod(numberString,&end);
cout << "Number in String = " << numberString << endl;
cout << "Number in Double = " << number << endl;
cout << "End String = " << end << endl;
return 0;
}
運行程序時,輸出將是:
Number in End String = 12.44b 0xy Number in Double = 12.44 String = b 0xy
示例 2:strtod() 函數沒有尾隨字符
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
char numberString[] = "12.44";
char *end;
double number;
number = strtod(numberString,&end);
cout << "Number in String = " << numberString << endl;
cout << "Number in Double = " << number << endl;
// If end is not Null
if (*end) {
cout << end;
}
// If end is Null
else {
cout << "Null pointer";
}
return 0;
}
運行程序時,輸出將是:
Number in End String = 12.44b 0xy Number in Double = 12.44 Null pointer
strtod() 函數的有效浮點值包含可選的 + 或 - 符號,後跟以下集合之一:
-
對於十進製浮點值:
-
一組十進製數字 (0-9),可選擇包含小數點 (.)。
例如:13.170、-5.63 等。 -
可選的 index 部分(e 或 E),後跟可選的 + 或 - 符號和非空的十進製數字序列。
例如:3.46101e+007、13.19e-013等。
-
-
對於十六進製浮點值:
-
以 0x 或 0X 開頭的字符串,後跟一個非空的十六進製數字序列,可以選擇包含小數點 (.)。
例如:0xfa5、-0xb1f.24 等。 -
可選的 index 部分(p 或 P),後跟可選的 + 或 - 符號和非空的十六進製數字序列。
例如:0x51c.23p5、-0x2a.3p-3 等。
-
-
Infinity:
-
INF 或 INFINITY(忽略大小寫)。
例如:-Inf、InfiNiTy 等。
-
-
NaN(不是數字):
-
NAN 或 NANsequence(忽略大小寫),其中 sequence 是僅由字母數字字符或下劃線 (_) 組成的字符序列。結果是一個安靜的 NaN。
例如:Nan、NaNab1 等。
-
示例 3:strtod() 如何與 index 和十六進製一起使用?
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
// initialize a exponential value
char numberString[] = "-44.01e-3End String";
char *end;
double number;
number = strtod(numberString,&end);
cout << "Number in String = " << numberString << endl;
cout << "Number in Double = " << number << endl;
cout << "End String = " << end << endl << endl;
// initialize a new hexadecimal value
strcpy(numberString,"0xf1bc.51hello");
number = strtod(numberString,&end);
cout << "Number in String = " << numberString << endl;
cout << "Number in Double = " << number << endl;
cout << "End String = " << end << endl;
return 0;
}
運行程序時,輸出將是:
Number in String = -44.01e-3End String Number in Double = -0.04401 End String = End String Number in String = 0xf1bc.51hello Number in Double = 61884.3 End String = hello
示例 4:infinity 和 NaN 的 strtod 案例
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
char *end;
cout << "INFINITY" << " to Double = " << strtod("INFINITY", &end) << endl;
cout << "End String = " << end << endl << endl;
cout << "Infabc" << " to Double = " << strtod("Infabc", &end) << endl;
cout << "End String = " << end << endl << endl;
cout << "NaN12a" << " to Double = " << strtod("NaN12a", &end) << endl;
cout << "End String = " << end << endl << endl;
return 0;
}
運行程序時,輸出將是:
INFINITY to Double = inf End String = Infabc to Double = inf End String = abc NaN12a to Double = nan End String = 12a
通常,strtod() 函數的有效浮點參數具有以下形式:
[空白] [- | +] [數字] [.digits] [ {e | E }[- | +]數字]
strtod() 函數會忽略所有前導空白字符,直到找到主要的非空白字符。
然後,從這個字符開始,盡可能多的字符組成一個有效的浮點表示並將它們轉換為浮點值。在最後一個有效字符之後字符串的剩餘部分存儲在 end 指向的對象中。
示例 5:strtod() 帶有前導空格的函數
#include <iostream>
#include <cstdlib>
using namespace std;
int main()
{
char *end;
cout << "25.5" << " to Double = " << strtod(" 25.5", &end) << endl;
// end pointer is set to null
cout << "End String = " << end << endl << endl;
// Returns 0 because of invalid conversion
cout << "abc11.20" << " to Double = " << strtod("abc11.20", &end) << endl;
cout << "End String = " << end << endl << endl;
return 0;
}
運行程序時,輸出將是:
25.5 to Double = 25.5 End String = abc11.20 to Double = 0 End String = abc11.20
相關用法
- C++ strtod()用法及代碼示例
- C++ strtok()用法及代碼示例
- C++ strtoimax()用法及代碼示例
- C++ strtoull()用法及代碼示例
- C++ strtoll()用法及代碼示例
- C++ strtoul()用法及代碼示例
- C++ strtoumax()用法及代碼示例
- C++ strtol()用法及代碼示例
- C++ string::length()用法及代碼示例
- C++ strchr()用法及代碼示例
- C++ string::npos用法及代碼示例
- C++ strncat()用法及代碼示例
- C++ strcat()用法及代碼示例
- C++ strstr()用法及代碼示例
- C++ strcat() vs strncat()用法及代碼示例
- C++ strcmp()用法及代碼示例
- C++ strcspn()用法及代碼示例
- C++ strpbrk()用法及代碼示例
- C++ strxfrm()用法及代碼示例
- C++ strspn()用法及代碼示例
注:本文由純淨天空篩選整理自 C++ strtod()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。