Spec-Zone.ru › C

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)
  • шестнадцатеричное выражение с плавающей точкой. Оно состоит из следующих частей:
    • (необязательно) знак плюс или минус
    • 0x или 0X
    • непустая последовательность шестнадцатеричных цифр, которая может содержать символ десятичного разделителя (определяемый текущей локалью C) (задаёт мантиссу)
    • (необязательно) p или P, за которыми следует необязательный знак минус или плюс и непустая последовательность десятичных цифр (задаёт показатель степени с основанием 2)
  • выражение бесконечности. Оно состоит из следующих частей:
    • (необязательно) знак плюс или минус
    • INF или INFINITY без учёта регистра
  • выражение «не число». Оно состоит из следующих частей:
    • (необязательно) знак плюс или минус
    • NAN или NAN(char_sequence ) без учёта регистра в части NAN. char_sequence может содержать только цифры, латинские буквы и символы подчёркивания. Результатом является значение NaN с плавающей точкой без сигнального исключения.
(начиная с 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

См. также

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/c/string/byte/strtof

Spec-Zone.ru

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