Spec-Zone.ru › C

strtof, strtod, strtold

Определено в заголовочном файле <stdlib.h>
float       strtof( const char *restrict str, char **restrict str_end );
(с C99)
double      strtod( const char          *str, char          **str_end );
(до C99)
double      strtod( const char *restrict str, char **restrict str_end );
(с C99)
long double strtold( const char *restrict str, char **restrict str_end );
(с C99)

Интерпретирует значение с плавающей запятой в строке байтов, на которую указывает str.

Функция пропускает все пробельные символы (как определяется isspace) до тех пор, пока не найдёт первый непробельный символ. Затем она берёт как можно больше символов, чтобы сформировать корректное представление с плавающей запятой, и преобразует их в значение с плавающей запятой. Корректное значение с плавающей запятой может быть одним из следующих:

  • десятичное представление с плавающей запятой. Оно состоит из следующих частей:
    • (необязательно) знак плюс или минус
    • непустая последовательность десятичных цифр, необязательно содержащая десятичную точку (как определяется текущим C локаль) (определяет мантиссу)
    • (необязательно) e или E, за которыми следует необязательный знак плюс или минус и непустая последовательность десятичных цифр (определяет показатель степени по основанию 10)
  • шестнадцатеричное представление с плавающей запятой. Оно состоит из следующих частей:
    • (необязательно) знак плюс или минус
    • 0x или 0X
    • непустая последовательность шестнадцатеричных цифр, необязательно содержащая десятичную точку (как определяется текущим C локаль) (определяет мантиссу)
    • (необязательно) p или P, за которыми следует необязательный знак плюс или минус и непустая последовательность десятичных цифр (определяет показатель степени по основанию 2)
  • представление бесконечности. Оно состоит из следующих частей:
    • (необязательно) знак плюс или минус
    • INF или INFINITY без учёта регистра
  • представление нечисла (NaN). Оно состоит из следующих частей:
    • (необязательно) знак плюс или минус
    • NAN или NAN(последовательность_символов) без учёта регистра части NAN. последовательность_символов может содержать только цифры, латинские буквы и нижние подчёркивания. Результатом является тихое значение NaN с плавающей запятой.
(с C99)
  • любое другое представление, которое может быть принято текущей установленной C локаль

Функции устанавливают указатель, на который указывает str_end, на символ, следующий за последним интерпретированным символом. Если str_end равен нулевому указателю, он игнорируется.

Параметры

str - указатель на завершающую нулём строку байтов для интерпретации
str_end - указатель на указатель на символ.

Возвращаемое значение

Значение с плавающей запятой, соответствующее содержимому str при успешном выполнении. Если преобразованное значение выходит за пределы диапазона соответствующего типа возврата, возникает ошибка диапазона (errno устанавливается в ERANGE) и возвращается HUGE_VAL, HUGE_VALF или HUGE_VALL. Если преобразование невозможно, возвращается ​0​.

Пример

#include <stdio.h>
#include <errno.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;
    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

Ссылки

  • Стандарт 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

См. также

atof
преобразует строку байтов в значение с плавающей запятой
(функция)
wcstofwcstodwcstold
(C99)(C95)(C99)
преобразует широкую строку в значение с плавающей запятой
(функция)
Документация C++ для strtof, strtod, strtold

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/byte/strtof

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API