2010-06-07 9 views
11

कनवर्ट करना मैं float मान char* पर C भाषा में कैसे परिवर्तित कर सकता हूं?फ्लोट को चार *

+6

आपको और अधिक विशिष्ट होने की आवश्यकता होगी। आप क्या चाहते हैं - फ्लोट के दशमलव मूल्य का एक पाठ्य प्रतिनिधित्व? बाइट्स की एक धारा जिसे आप आसानी से पास कर सकते हैं और बाद में फ्लोट का पुनर्निर्माण करने के लिए उपयोग कर सकते हैं? – crazyscot

उत्तर

26
char buffer[64]; 
int ret = snprintf(buffer, sizeof buffer, "%f", myFloat); 

if (ret < 0) { 
    return EXIT_FAILURE; 
} 
if (ret > sizeof buffer) { 
    /* Result was truncated - resize the buffer and retry. 
} 

कि myCharPointer में myFloat की स्ट्रिंग प्रतिनिधित्व स्टोर करेगा। सुनिश्चित करें कि स्ट्रिंग इसे पकड़ने के लिए पर्याप्त है, हालांकि।

snprintfsprintf से एक बेहतर विकल्प के रूप में यह गारंटी देता है यह आप तर्क में आपूर्ति बफर के आकार अतीत कभी नहीं लिखेंगे है 2.

+5

पर प्रिंट करना चाहते हैं तो बफर ओवररन सुनिश्चित करने के लिए स्नप्रिंटफ़ का उपयोग करें। – JeremyP

+0

शानदार विचार! मैं इसे अपने उत्तर में जोड़ दूंगा ... –

8
char array[10]; 
sprintf(array, "%f", 3.123); 

sprintf: (MSDN से)

+0

@ एजे जब बफर में मूल्य मुद्रित किया जाता है तो वही प्रिंट स्टेटमेंट कंसोल पर भी मुद्रित किया जाएगा .... – boom

+0

स्प्रिंटफ बफर में फ्लोट वैल्यू लिखेंगे। यदि आप इसे प्रिंट कंसोल ("% f" ... –

2
char* str=NULL; 
int len = asprintf(&str, "%g", float_var); 
if (len == -1) 
    fprintf(stderr, "Error converting float: %m\n"); 
else 
    printf("float is %s\n", str); 
free(str); 
+0

+1 निर्दिष्ट होना चाहिए कि यह एक जीएनयू एक्सटेंशन afaik है।(asprintf एक जीएनयू एक्सटी मेरा मतलब है) – ShinTakezou

0
char array[10]; 
snprintf(array, sizeof(array), "%f", 3.333333); 
arduino में
4

:

//temporarily holds data from vals 
char charVal[10];     

//4 is mininum width, 3 is precision; float value is copied onto buff 
dtostrf(123.234, 4, 3, charVal); 

monitor.print("charVal: "); 
monitor.println(charVal); 
1

उत्तर स्वीकार करने के बाद लंबे समय तक।

sprintf(), या संबंधित कार्यों का उपयोग करें, जैसा कि कई अन्य लोगों ने सुझाव दिए हैं, लेकिन एक बेहतर प्रारूप विनिर्देशक का उपयोग करें।

"%.*e" का उपयोग करना, कोड विभिन्न मुद्दों को हल करती है:

  • अधिकतम बफर आकार की जरूरत कहीं अधिक उचित है, 18. sprintf(buf, "%f", FLT_MAX); तरह 47+ की जरूरत सकता है। sprintf(buf, "%f", DBL_MAX); 317+

  • का उपयोग ".*"float x की एक स्ट्रिंग संस्करण भेद करने के लिए की जरूरत दशमलव स्थानों की संख्या को परिभाषित करने के कोड की अनुमति देता है और यह अगले सर्वोच्च float पड़ सकता है। के विवरण के लिए, Printf width specifier to maintain precision of floating-point value

  • "%e" का उपयोग करना देखें कोड बल्कि सभी मुद्रण "0.000000" जो परिणाम जब |x| < 0.0000005 है की तुलना में एक दूसरे से छोटे float रों भेद करने के लिए अनुमति देता है।

    #define FLT_STRING_SIZE (1+1+1+(FLT_DECIMAL_DIG-1)+1+1+ 4 +1) 
            // - d . dddddddd   e - dddd \0 
    
    char buf[FLT_STRING_SIZE]; 
    sprintf(buf, "%.*e", FLT_DECIMAL_DIG-1, some_float); 
    

विचार:
IMO, बेहतर buf[FLT_STRING_SIZE*2] तरह खरोंच पैड के लिए 2x बफर आकार का उपयोग करें।
अतिरिक्त मजबूती के लिए, snprint() का उपयोग करें।

2
typedef union{ 
    float a; 
    char b[4]; 
} my_union_t; 

आप बाइट द्वारा फ्लोट डेटा वैल्यू बाइट तक पहुंच सकते हैं और इसे बिना 8-बिट आउटपुट बफर (उदा। यूएसएआरटी) के माध्यम से भेज सकते हैं।

+0

अद्यतन: प्रोसेसर की अंतहीनता के बारे में मत भूलना! – Peter

संबंधित मुद्दे