2012-05-15 35 views
7

Bir dosyadan okudum ve char * olarak sakladığım bir değere sahibim. Değer bir parasal sayıdır, #. ## ##. ## veya ###. ##. Char * 'i hesaplamalarımda kullanabileceğim bir sayıya dönüştürmek istiyorum, atof ve strtod denedim ve sadece çöp numaraları verdiler. Bunu yapmanın doğru yolu nedir ve neden yanlış yapıyorum?Char * veya float dönüştürmek

Bu aslında yaptığım şey, sadece char * değeri bir dosyadan okunur. Temp ve ftemp değişkenlerini yazdırdığımda sadece çöp, devasa negatif sayılar.

Başka Düzenleme:

Ben 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; 

}

tam olarak bu çalıştırıyorum ve benim çıkış fiyatıdır: 3.344.336,000000, 3344336,000000

Düzenleme: İşte benim kod

olduğunu
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); 
değer dolar olmak

NAME|VALUE 
NAME|VALUE 
NAME|VALUE 

tutarlar

ÇÖZÜLDÜ: Tüm, ben% d yerine% f kullanılarak ve duymadınız ederiz'

benim girdi dosyası çok basit isim, böyle değer çiftleri ise Doğru başlıkları içermeli.

+4

Sorun başka bir yerde olmalı, gönderdiğiniz kod tamamen geçerli ve çalışıyor. Lütfen dosyanızı nasıl okuduğunuzu bize gösterin. –

+0

1. "atof", "double" değerini de döndürür: http://pubs.opengroup.org/onlinepubs/007904875/functions/atof.html – ArjunShankar

+0

2. "% d" tamsayılar içindir. '% F' kullanın. – ArjunShankar

cevap

21

Bir şunlardır eksik: #include <stdlib.h>, GCC çöp değerlere götürmüştür atof ve atod örtülü bir deklarasyon oluşturur böylece.

Ve çift için biçim belirteci %d değil (tamsayılar içindir) %f'dur.

#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. Sağ. Sorun bu. [OPs düzenlemeleri önce aslında üç sorun vardı] – ArjunShankar

1

Sizin tarafınızdan gönderilmiş kod doğru ve çalışmış olmalı. Ama tam olarak char*’da ne olduğunu kontrol edin. Doğru değeri temsil edilecek büyüklükte ise, işlevler HUGE_VAL pozitif veya negatif olarak dönecektir. char* numaralı telefondan, float ve double'un bilgisayarınızda gösterebileceği maksimum değerlere karşı olanı kontrol edin.

this page for strtod reference ve this page for atof reference'u denetleyin.

Hem Windows hem de Linux'ta sağladığınız örneği denedim ve iyi çalıştı.

+1

' ye göre: http://pubs.opengroup.org/onlinepubs/007904875/functions/atof.html (C standardıyla hizalı olan): "Değer temsil edilemiyorsa , davranış tanımsızdır. " – ArjunShankar

+0

Değerler, her iki değişken türünün temsil edebileceğinden çok daha küçüktür, sahip olduğum en büyük değer 120.55'dir. – Andrew

+0

@George: cplusplus.com'u kullanma. Hatalarla dolu. Bir taşma durumunda ne "atof" ne de "strtod" HUGE_VAL döndürür. [Cppreference] 'e göre (http://en.cppreference.com/w/c/string/byte/atof), dönüş değeri tanımsızdır. –

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

Bu senin sorunun. Bağımsız değişkenler double ve float türlerinden olduğu için, her ikisi için de %f kullanıyor olmalısınız (printf değişken bir işlev olduğundan, ftempdouble'a yükseltilecektir).

%d, karşılık gelen bağımsız değişkenin , değil double olmasını bekler.

printf gibi değişken işlevler, değişken bağımsız değişken listesindeki argüman türlerini gerçekten bilmez; bunu dönüşüm belirteci ile söylemelisiniz. İlk argümanın int olması gerektiği printf'dan beri, printf argüman listesinden bir sonraki sizeof (int) bayt alır ve bunu bir tamsayı değeri olarak yorumlayacaktır; bu nedenle ilk çöp numarası.

Şimdi, neredeyse pilli sizeof (int) < sizeof (double) yüzden printf argüman listesinden sonraki sizeof (double) bayt aldığında, muhtemelen temp orta byte yerine ftemp birinci baytı ile başlıyor; Bu nedenle ikinci çöp numarası. Her ikisi için de %f kullanın.