2013-02-04 2 views
-1

void 포인터 형식으로 float을 전달하는 함수를 작성하고 있습니다. 내가하려고하는 것은 플로트를 문자열과 동등한 것으로 변환하여 메모리에 이진 데이터를 저장할 수있게합니다. 사용자가 나에게float를 c로 된 문자열로 변환

float value = 3.14; 

를 전달

void * f(void * data); 

경우 아래 그림과 같이 내가 문자열로 변환하고 싶습니다 :

"3.14" 
예를 들어, 다음과 같이 내 함수 호출입니다

내가 사용해야한다고 생각하는 접근법은 먼저 float 내의 값 수를 결정하는 것입니다 : 3.14 = 4 값. 그런 다음 각 값을 반복하여 문자로 변환해야합니다.

내가 겪고있는 몇 가지 문제는 다음과 같습니다. 1 : 주어진 float 값과 관련된 값의 수를 결정할 수 있는지 확실하지 않습니다. 2 : 어떻게 각 값을 해당 문자열로 변환합니까?

나는 itoa와 sprintf를 발견했습니다. 그러나 itoa는 표준 라이브러리의 일부가 아니며 sprintf가 원하는대로 할 것인지 여부를 확신 할 수 없습니다.

+2

sprintf와 오버 플로우 수 있기 때문에 sprintf는 (캐릭터, "%의 4.2f", 플로트) –

+1

당신은 아마'sprintf'을 원하는 snprintf보다 더 위험하다. 당신은 숫자의 숫자를 (일반적으로) 알아낼 수 없다. - 예를 들어'1.2 '처럼 전달 된 것은'1.99999999999999'의 순서로 끝날 것이다. 부동 소수점은 정확하게 '0.2'를 표현할 수 없습니다 . –

답변

3

대부분의 시스템은 (특히 POSIX 것들에) snprintf (및 strdup)가 그래서 당신이 (당신이 free의 결과에해야 해당 문자열, strdup을 반환하려는 경우는

char buf[48]; 
snprintf (buf, sizeof(buf), "%f", x); 

를 코딩 할 수있다 strdup).

PS :이 버퍼를

+1

버퍼를 확보해야합니다 ('strdup()'에서). – SparKot

+0

버퍼가 할당되면 float가 버퍼보다 ​​클 수 없다고 가정하는 것이 안전합니까? 48 바이트는? – kubiej21

+0

대부분의 PC에서'float '은 4 바이트이고'double'은 8 바이트이고'snprintf '와'strdup'의 결과는 12 바이트 이상이 될 수 있습니다 (그리고'malloc'-ed 메모리 'strdup '와 같은 결과는 종종 약간의 오버 헤드가 있습니다.) –