2012-05-15 3 views
7

파일에서 값을 읽었으며 char *로 저장됩니다. 값은 화폐 번호, #. ##, ##. ## 또는 ###. ##입니다. char *를 계산에 사용할 수있는 숫자로 변환하고 싶습니다. atof 및 strtod를 시도하고 쓰레기 번호를 알려줍니다. 이 작업을 수행하는 올바른 방법은 무엇이며, 내가 잘못하고있는 이유는 무엇입니까?char *를 float 또는 double로 변환

이것은 본질적으로 내가하고있는 것입니다. char * 값은 파일에서 읽습니다. 임시 변수와 ftemp 변수를 출력 할 때 그들은 거대한 음수 일뿐입니다.

또 다른 편집 :

나는 GCC

#include <stdio.h> 
int main() 
{ 
char *test = "12.11"; 
double temp = strtod(test,NULL); 
float ftemp = atof(test); 
printf("price: %f, %f",temp,ftemp); 
return 0; 

}

에서 정확히 실행하고 내 출력은 가격입니다 : 3344336.000000, 3344336.000000

편집 : 여기 내 코드

입니다
if(file != NULL) 
    { 
     char curLine [128]; 
     while(fgets(curLine, sizeof curLine, file) != NULL) 
     {    
      tempVal = strtok(curLine,"|");   
      pairs[i].name= strdup(tempVal); 
      tempVal = strtok(NULL,"|"); 
      pairs[i].value= strdup(tempVal); 
      ++i; 
     } 
     fclose(file); 
    } 

    double temp = strtod(pairs[0].value,NULL); 
    float ftemp = atof(pairs[0].value); 
    printf("price: %d, %f",temp,ftemp); 
값이 달러 인과

NAME|VALUE 
NAME|VALUE 
NAME|VALUE 

을 금액

이 해결 : 여러분 모두, 내가 % d 개 대신 %의 F를 사용하여 didn를 한 감사 '617,451,515,

내 입력 파일은 매우 간단합니다 이름이 같은 값 쌍입니다 올바른 헤더가 포함되어 있습니다.

+4

문제는 다른 곳에 있어야하며 게시 한 코드는 완벽하게 유효하며 작동합니다. 파일을 읽는 방법을 보여주십시오. –

+0

1.'atof'는'double'을 리턴합니다 : http://pubs.opengroup.org/onlinepubs/007904875/functions/atof.html – ArjunShankar

+0

2.'% d'는 정수입니다. '% f'을 사용하십시오. – ArjunShankar

답변

21

당신은 포함 누락 : #include <stdlib.h>를, GCC는 쓰레기 값을 선도 atofatod의 암시 적 선언을 생성하므로.

double의 형식 지정자는 %f이 아니고 %d (정수)입니다.

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

int main() 
{ 
    char *test = "12.11"; 
    double temp = strtod(test,NULL); 
    float ftemp = atof(test); 
    printf("price: %f, %f",temp,ftemp); 
    return 0; 
} 
/* Output */ 
price: 12.110000, 12.110000 
+1

+1. 권리. 이게 문제 야. [OP가 편집되기 전에 실제로 세 가지 문제가있었습니다] – ArjunShankar

1

코드는 정확하며 올바르게 작성해야합니다. 하지만 char*에있는 것을 정확히 확인하십시오. 정확한 값을 표시하기 위해 커지려면 함수는 양수 또는 음수를 반환합니다. HUGE_VAL. 컴퓨터에 floatdouble이 표시 될 수있는 최대 값과 비교하여 char*에있는 항목을 확인하십시오.

체크 this page for strtod referencethis page for atof reference을 확인하십시오.

Windows 및 Linux에서 제공 한 예제를 사용해 보았지만 제대로 작동했습니다.

+1

에 따라 : http://pubs.opengroup.org/onlinepubs/007904875/functions/atof.html (C 표준과 일치) : "값을 나타낼 수없는 경우 , 동작이 정의되지 않았습니다. " – ArjunShankar

+0

값은 모두 변수 유형이 나타낼 수있는 최대 값보다 훨씬 작습니다. 최대 값은 120.55입니다. – Andrew

+0

@George : cplusplus.com을 사용하지 마십시오. 오류가 많습니다. 오버 플로우의 경우'atof' 나'strtod '는 HUGE_VAL로 돌아 가지 않습니다. [cppreference] (http://en.cppreference.com/w/c/string/byte/atof)에 따르면 반환 값은 정의되지 않습니다. –

0
printf("price: %d, %f",temp,ftemp); 
       ^^^ 

이 당신의 문제입니다. 인수 유형 doublefloat 때문에, 당신은 (printf는 가변 기능이기 때문에, ftempdouble로 승격됩니다) 모두 %f를 사용한다.

%d은 해당 인수가 이 아니라 double이 아닌 것으로 예상합니다.

printf과 같은 가변 인자 함수는 가변 인수 목록에서 인수의 유형을 실제로 알지 못합니다. 당신은 변환 지정자와 함께 그것을 말해야합니다. printf에 첫 번째 인수가 int으로되어 있다고 말했기 때문에 printf는 인수 목록에서 다음 sizeof (int) 바이트를 취하여 정수 값으로 해석합니다. 따라서 첫 번째 쓰레기 번호.

지금, 그것은 거의 지장이 없다는 것 sizeof (int) < sizeof (double), 그래서 printf는 인수 목록에서 다음 sizeof (double) 바이트를 취한다 때, 아마 temp의 중간 바이트보다는 ftemp의 첫 번째 바이트로 시작하는 것; 따라서 두 번째 쓰레기 번호.

두 가지 모두에 %f을 사용하십시오.

관련 문제