티스토리 뷰
☞ strtod, strtof, strtold, atof, ecvt, fcvt, gcvt
<math.h>
<stdlib.h>
double strtod(const char *str, char **tailptr);
float strtof(const char *str, char **tailptr);
long double strtold(const char *str, char **tailptr);
double atof(const char *str);
char *ecvt(double value, int ndigit, int *decpt, int *neg);
char *fcvt(double value, int ndigit, int *decpt, int *neg);
char *gcvt(double value, int ndigit, char *buf);
str로 지정한 문자열에 있는 실수 데이터를 추출하여 double, float, long double 타입의 실수값을 리턴합니다. strto...() 함수들은 tailptr을 NULL 포인터가 아니라 문자열 포인터의 포인터로 전달하면 변환된 다음 위치를 tailptr에 저장해 줍니다.
☞ 예제1
char *str = " 1234.5678 456.1"; char *ptr; printf("\n%f %f ", atof(str), strtod(str, &ptr)); printf("\n%s %f ", ptr, strtod(ptr, NULL));
1234.567800 1234.567800 456.1 456.100000
위의 예제를 보면 일단 atof()와 strtod()는 동일한 값을 리턴 합니다. 앞쪽의 isspace()로 구분되는 화이트 스페이스는 무시되고 실수 표현 방식으로 기술된 문자열 실수를 찾습니다. 해당하는 실수가 없으면 0을 리턴하고 strto...()의 경우 변환이 되지 않았으므로 tailptr도 이동되지 않습니다. 오버플로우 등을 확인하여 안전한 변환을 수행하려면 strto..() 함수를 사용하는 것이 적절합니다.
☞ 예제2
int dec, sign; char strbuf[16]; printf("\n%s",ecvt(3.14159265358979323846264338327, 5, &dec, &sign)); printf("\n%d, %d", dec, sign); printf("\n%s",fcvt(31.4159265358979323846264338327, 6, &dec, &sign)); printf("\n%d, %d", dec, sign); printf("\n%s",gcvt(314.159265358979323846264338327, 7, strbuf));
31416 1, 0 31415927 2, 0 314.1593
ecvt(), fcvt(), gcvt()는 실수를 문자열로 변환합니다. ecvt(), fcvt()는 문자열을 리턴하지만 시스템의 정적 공간의 포인터를 리턴하기 때문에 연속적으로 ecvt(), fcvt()를 호출하면 이전 자료가 지워질 수 있는 문제점이 있습니다. 멀티 쓰레드 환경에서는 안전하지 않을 수 있습니다. ecvt()는 ndigit 만큼의 부호나 소숫점이 없는 정수를 리턴하고 decpt, neg로 지정한 정수 포인터 위치에 소수점의 위치와 부호를 저장합니다. 부호는 0이나 양수면 0, 음수면 0이 아닌값을 저장합니다. fcvt()는 ecvt()와 같지만 ndigit가 전체 크기가 아니라 소수점 아래의 크기를 나타냅니다. 위의 예제2를 보면 31.4159265358979323846264338327에 대해서 fcvt()를 ndigit 6으로 호출 했는데 소수점 아래가 6이므로 소수점 위의 2와 더하면 총 8의 크기를 갖게 됩니다. gcvt()는 사용자 버퍼에 변환 결과를 저장하는데 지정하는 ndigit는 전체 자리수를 나타냅니다. 각 함수들은 자리수를 넘어서는 부분에서 반올림 처리 합니다.
'C | C++' 카테고리의 다른 글
시간과 일자 관련 함수 (0) | 2018.06.29 |
---|---|
시간 측정 (0) | 2018.06.29 |
문자열의 정수 변환 (0) | 2018.06.29 |
산술 연산 함수 (0) | 2018.06.29 |
정수 나누기 함수 (0) | 2018.06.29 |