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의 자세한 내용을 확인할 수 있어요.