Функция strtod () в C ++ интерпретирует содержимое строки как число с плавающей запятой и возвращает его значение как двойное.
Эта функция также устанавливает указатель так, чтобы он указывал на первый символ после последнего допустимого символа в строке, если он есть, в противном случае указатель устанавливается в нуль.
Для базы 10 и строки «12abc»
Действительная числовая часть -> 12
Первый символ после действительной числовой части -> a
Это определено в заголовочном файле.
strtod () прототип
двойной strtod (const char * str, char ** end);
Функция strtod () принимает в качестве параметра строку и указатель на символ, интерпретирует содержимое строки как float
число и возвращает double
значение.
Параметры strtod ()
- str : строка, имеющая представление числа с плавающей запятой.
- конец : ссылка на уже выделенный объект типа char *. Значение end устанавливается функцией на следующий символ в строке после последнего допустимого символа. Этот параметр также может быть нулевым указателем, и в этом случае он не используется.
strtod () Возвращаемое значение
Функция strtod () возвращает:
- двойное значение (которое преобразуется из строки).
- 0.0, если не удалось выполнить действительное преобразование.
Если преобразованное значение выходит за пределы диапазона, возникает ошибка диапазона и возвращается положительное или отрицательное значение HUGE_VAL.
Пример 1: Как работает функция strtod ()?
#include #include 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; )
Когда вы запустите программу, вывод будет:
Число в конце строки = 12.44b 0xy Число в двойном формате = 12,44 String = b 0xy
Пример 2: функция strtod () без завершающих символов
#include #include 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; )
Когда вы запустите программу, вывод будет:
Число в конечной строке = 12.44b 0xy Число в двойном формате = 12.44 Нулевой указатель
Допустимое значение с плавающей запятой для функции strtod () состоит из необязательного знака + или -, за которым следует один из следующих наборов:
-
Для десятичных значений с плавающей запятой :
-
Группа десятичных цифр (0–9), необязательно содержащая десятичную точку (.).
Например: 13,170, -5,63 и т. Д. -
Необязательная часть экспоненты (e или E), за которой следует необязательный знак + или - и непустая последовательность десятичных цифр.
Например: 3.46101e + 007, 13.19e-013 и т. Д.
-
-
Для шестнадцатеричного значения с плавающей запятой :
-
Строка, начинающаяся с 0x или 0X, за которой следует непустая последовательность шестнадцатеричных цифр, необязательно содержащая десятичную точку (.).
Например: 0xfa5, -0xb1f.24 и т. Д. -
Необязательная часть экспоненты (p или P), за которой следует необязательный знак + или - и непустая последовательность шестнадцатеричных цифр.
Например: 0x51c.23p5, -0x2a.3p-3 и т. Д.
-
-
Бесконечность :
-
INF или INFINITY (без учета регистра).
Например: -Inf, InfiNiTy и т. Д.
-
-
NaN (не число) :
-
NAN или NANsequence (без учета регистра), где последовательность - это последовательность символов, состоящая только из буквенно-цифровых символов или символа подчеркивания (_). Результат - тихий NaN.
Например: Nan, NaNab1 и т. Д.
-
Пример 3: Как strtod () работает с экспонентами и шестнадцатеричными числами?
#include #include #include 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; )
Когда вы запустите программу, вывод будет:
Число в строке = -44.01e-3 End String Number in Double = -0.04401 End String = End String Number in String = 0xf1bc.51hello Number in Double = 61884.3 End String = hello
Пример 4: strtod Cases для INFINITY и NaN
#include #include 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 в Double = inf End String = Infabc в Double = inf End String = abc NaN12a в Double = nan End String = 12a
В общем, допустимый аргумент с плавающей запятой для функции strtod () имеет следующую форму:
(пробел) (- | +) (цифры) (. цифры) ((e | E) (- | +) цифры)
Функция strtod () игнорирует все начальные пробельные символы до тех пор, пока не будет найден основной непробельный символ.
Затем, начиная с этого символа, требуется как можно больше символов, которые формируют допустимое представление с плавающей запятой и преобразуют их в значение с плавающей запятой. Все, что осталось от строки после последнего допустимого символа, сохраняется в объекте, на который указывает конец.
Пример 5: функция strtod () с ведущими пробелами
#include #include 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 до Double = 25,5 Конечная строка = abc11.20 до Double = 0 Конечная строка = abc11.20