strtof, strtod, strtold
Определено в заголовочном файле <stdlib.h> | ||
|---|---|---|
float strtof ( const char* restrict str, char** restrict str_end ); | (1) | (начиная с C99) |
double strtod ( const char* str, char** str_end ); | (2) | (до C99) |
double strtod ( const char* restrict str, char** restrict str_end ); | (начиная с C99) | |
long double strtold( const char* restrict str, char** restrict str_end ); | (3) | (начиная с C99) |
Интерпретирует значение с плавающей точкой в байтовой строке, на которую указывает str.
Функция отбрасывает все символы пробельных символов (определяемых с помощью isspace), пока не будет найден первый непробельный символ. Затем она считывает максимально возможное количество символов, образующих корректное представление числа с плавающей точкой, и преобразует их в значение с плавающей точкой. Корректное представление числа с плавающей точкой может быть одним из следующих:
- десятичное выражение с плавающей точкой. Оно состоит из следующих частей:
- (необязательно) знак плюс или минус
- непустая последовательность десятичных цифр, которая может содержать символ десятичного разделителя (определяемый текущей локалью C) (задаёт мантиссу)
-
(необязательно)
eилиE, за которыми следует необязательный знак минус или плюс и непустая последовательность десятичных цифр (задаёт показатель степени с основанием 10)
| (начиная с C99) |
- любое другое выражение, которое может быть принято установленной в данный момент локалью C.
Функции устанавливают указатель, на который указывает str_end, так, чтобы он указывал на символ, следующий за последним интерпретированным символом. Если str_end является нулевым указателем, он игнорируется.
Параметры
| str | - | указатель на байтовую строку с завершающим нулевым символом, подлежащую интерпретации |
| str_end | - | указатель на указатель на символ |
Возвращаемое значение
Значение с плавающей точкой, соответствующее содержимому str, если операция выполнена успешно. Если преобразованное значение выходит за пределы диапазона соответствующего типа возвращаемого значения, возникает ошибка диапазона (errno устанавливается в ERANGE), а функция возвращает HUGE_VAL, HUGE_VALF или HUGE_VALL. Если преобразование невозможно выполнить, возвращается 0.
Пример
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// parsing with error handling
const char* p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6 1.18973e+4932zzz";
printf("Parsing '%s':\n", p);
char* end = NULL;
for (double f = strtod(p, &end); p != end; f = strtod(p, &end))
{
printf("'%.*s' -> ", (int)(end - p), p);
p = end;
if (errno == ERANGE)
{
printf("range error, got ");
errno = 0;
}
printf("%f\n", f);
}
// parsing without error handling
printf("\" -0.0000000123junk\" --> %g\n", strtod(" -0.0000000123junk", NULL));
printf("\"junk\" --> %g\n", strtod("junk", NULL));
}
Возможный вывод:
Parsing '111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6 1.18973e+4932zzz': '111.11' -> 111.110000 ' -2.22' -> -2.220000 ' Nan' -> nan ' nan(2)' -> nan ' inF' -> inf ' 0X1.BC70A3D70A3D7P+6' -> 111.110000 ' 1.18973e+4932' -> range error, got inf " -0.0000000123junk" --> -1.23e-08 "junk" --> 0
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.22.1.3 Функции strtod, strtof и strtold (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.22.1.3 Функции strtod, strtof и strtold (стр.: 249–251)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.22.1.3 Функции strtod, strtof и strtold (стр.: 342–344)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.20.1.3 Функции strtod, strtof и strtold (стр.: 308–310)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.10.1.4 Функция strtod
См. также
| преобразует байтовую строку в значение с плавающей точкой (функция) |
|
|
(C99)(C95)(C99) | преобразует широкую строку в значение с плавающей точкой (функция) |
Документация C++ для strtof, strtod, strtold |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/byte/strtof