atof

atof

문자열로 받은 숫자를 실제 부동소수점 값으로 바꿔야 할 때 써요. scanf처럼 형식을 지정하기보다는, 문자열 전체를 읽어서 숫자로 해석하고 싶을 때 유용해요.

출처: cppreference

본문

문법 (Syntax)

double atof ( const char * str );

설명 (Explanation)

str이 가리키는 바이트 문자열에서 부동소수점 값을 해석해요.

먼저 isspace가 판단하는 공백 문자를, 첫 공백이 아닌 문자가 나올 때까지 모두 버려요. 그 다음 유효한 부동소수점 표현을 만들 수 있는 최대한 많은 문자를 가져와 부동소수점 값으로 변환해요. 유효한 부동소수점 값은 다음 중 하나예요.

  • 10진 부동소수점 표현. 다음 부분으로 이뤄져요.
    • (선택) 플러스 또는 마이너스 부호
    • (선택) 10진 소수점 문자를 포함할 수 있는 비어 있지 않은 10진 숫자 시퀀스(현재 C 로케일이 판단). 유효 숫자(significand)를 정의해요
    • (선택) e 또는 E 뒤에 선택적인 마이너스/플러스 부호와 비어 있지 않은 10진 숫자 시퀀스(밑이 10인 지수를 정의)
  • 현재 설치된 C 로케일이 받아들일 수 있는 그 밖의 표현

매개변수 (Parameters)

  • str — 해석할 널 종료 바이트 문자열

반환값 (Return value)

성공하면 str의 내용에 해당하는 double 값. 변환된 값이 반환 타입의 범위를 벗어나면 반환값은 정의되지 않아요. 변환이 전혀 이뤄질 수 없으면 0.0을 반환해요.

참고 (Notes)

이름은 "ASCII to float"의 줄임말이에요.

예시 (Example)

아래 코드는 여러 형태의 입력이 어떻게 해석되는지 보여줘요. 맨 앞의 공백이 버려지고, 숫자로 해석 가능한 부분까지만 값을 만들고 나머지는 무시되는 걸 확인할 수 있어요.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("%g\n", atof("  -0.0000000123junk"));
    printf("%g\n", atof("0.012"));
    printf("%g\n", atof("15e16"));
    printf("%g\n", atof("-0x1afp-2"));
    printf("%g\n", atof("inF"));
    printf("%g\n", atof("Nan"));
    printf("%g\n", atof("1.0e+309"));   // UB: out of range of double
    printf("%g\n", atof("0.0"));
    printf("%g\n", atof("junk"));       // no conversion can be performed
}

가능한 출력 (Possible output):

-1.23e-08
0.012
1.5e+17
-107.75
inf
nan
inf
0
0

참고 문헌 (References)

  • C23 표준 (ISO/IEC 9899:2024): 7.22.1.1 The atof function (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018): 7.22.1.1 The atof function (p: TBD)
  • C11 표준 (ISO/IEC 9899:2011): 7.22.1.1 The atof function (p: 341)
  • C99 표준 (ISO/IEC 9899:1999): 7.20.1.1 The atof function (p: 307)
  • C89/C90 표준 (ISO/IEC 9899:1990): 4.10.1.1 The atof function

더 알아보기

  • 오류 처리를 더 세밀하게 하고 싶다면 strtod 계열을 쓰는 게 좋아요. 끝까지 변환된 위치를 알려주거든요.
  • cppreference 원문에서 atof의 자세한 내용을 확인할 수 있어요.