2009-07-14 16 views
27

Possible Duplicate:
How do I convert a double into a string in C++?स्ट्रिंग सी ++ से डबल में कनवर्ट करें?

मैं एक स्ट्रिंग संयोजित करना चाहते हैं और एक डबल और जी ++ इस त्रुटि फेंक है:

main.cpp: समारोह में 'int मुख्य()':
main.cpp: 40: त्रुटि: प्रकार 'स्थिरांक चार [2]' की अमान्य operands और बाइनरी 'ऑपरेटर +'

यहाँ करने के लिए 'डबल' कोड है जो उस पर त्रुटि फेंक है लाइन है:

 
storedCorrect[count] = "("+c1+","+c2+")"; 

संग्रहीत सही [] एक स्ट्रिंग सरणी है, और सी 1 और सी 2 दोनों युगल हैं। क्या मेरे प्रोग्राम को सही तरीके से संकलित करने की अनुमति देने के लिए सी 1 और सी 2 को तारों में परिवर्तित करने का कोई तरीका है?

+11

कैसे निम्नलिखित से उदाहरण से कुछ के बारे: http://www.codeproject.com/KB/recipes/Tokenizer.aspx वे बहुत ही कुशल और कुछ हद तक सुरुचिपूर्ण हैं। –

+0

http://stackoverflow.com/q/29200635/395461 – Shannon

उत्तर

22

उपयोग std::stringstream। इसके operator << सभी अंतर्निहित प्रकारों के लिए अधिभारित है। उसी तरह आप std::cout के साथ स्क्रीन पर प्रिंट -

#include <sstream>  

std::stringstream s; 
s << "(" << c1 << "," << c2 << ")"; 
storedCorrect[count] = s.str(); 

यह काम करता है जैसे आप उम्मीद थी। आप बस इसके बजाय एक स्ट्रिंग पर "प्रिंटिंग" कर रहे हैं। operator << के आंतरिक सुनिश्चित करने के लिए पर्याप्त जगह है और कोई आवश्यक रूपांतरण कर रहा है (उदाहरण के लिए, double से string)।

इसके अलावा, यदि आपके पास बूस्ट लाइब्रेरी उपलब्ध है, तो आप lexical_cast पर विचार कर सकते हैं। वाक्य रचना बहुत सामान्य सी ++ की तरह दिखता है - शैली डाले:

#include <string> 
#include <boost/lexical_cast.hpp> 
using namespace boost; 

storedCorrect[count] = "(" + lexical_cast<std::string>(c1) + 
         "," + lexical_cast<std::string>(c2) + ")"; 

हुड के अंतर्गत, boost::lexical_cast मूल रूप से एक ही बात हम std::stringstream के साथ किया था कर रही है। बूस्ट लाइब्रेरी का उपयोग करने के लिए एक महत्वपूर्ण लाभ यह है कि आप दूसरी तरफ जा सकते हैं (उदा।, string से double) बस आसानी से। atof() या strtod() और कच्चे सी-स्टाइल स्ट्रिंग के साथ और अधिक गड़बड़ नहीं है।

+0

दरअसल, 'boost :: lexical_cast' हुड के नीचे 'std :: stringstream' का उपयोग नहीं करता है। यह अपने स्वयं के रूपांतरण दिनचर्या लागू करता है जो 'स्ट्रिंगस्ट्रीम' का उपयोग करने से काफी तेज़ होते हैं और ज्यादातर मामलों में 'स्कैनफ़'/'printf' से अधिक तेज़ होते हैं। देखें: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/performance.html – Ferruccio

+0

'lexical_cast' का स्रोत जब मैंने इसे देखा था तब से बहुत अलग दिखता है। ऐसा लगता है कि उन्होंने पिछले कुछ बूस्ट रिलीज में प्रदर्शन में काफी सुधार किया है। यदि आप कर सकते हैं तो इसके साथ जाने का और भी अधिक कारण है। –

71

आप इसे सीधे नहीं कर सकते हैं।

std::ostringstream s; 
s << "(" << c1 << ", " << c2 << ")"; 
storedCorrect[count] = s.str() 
  • उपयोग boost::lexical_cast:

    storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")"; 
    
  • उपयोग std::snprintf:

    1. एक std::stringstream का उपयोग करें: तरीके यह करने के लिए की एक संख्या हैं

      char buffer[256]; // make sure this is big enough!!! 
      snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2); 
      storedCorrect[count] = buffer; 
      

    विभिन्न डबल-टू-स्ट्रिंग रूपांतरण फ़ंक्शंस का उपयोग करके कई अन्य तरीके हैं, लेकिन ये मुख्य तरीके हैं जिन्हें आप इसे देखेंगे।

  • +4

    मुझे पता है कि यह उत्तर पुराना है, लेकिन आप 'std :: string to_string (double); 'यहां भी शामिल करना चाहेंगे। – JohnJohn

    1

    मेरा मानना ​​है कि स्प्रिंटफ आपके लिए सही काम है। मैं मानक पुस्तकालय में है, जैसे printf।आप डिफ़ॉल्ट स्वरूप (%f) स्वीकार कर सकते हैं

    http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

    +8

    'sprintf' संख्या स्वरूपण के लिए असुरक्षित है, क्योंकि यह आउटपुट बफर पर कोई सीमा जांच नहीं करता है, और बफर के आकार को निर्धारित करने के लिए कोई अच्छा पोर्टेबल तरीका नहीं है जो किसी भी 'डबल' मान के लिए सुरक्षित होगा। –

    +0

    ठीक है उस मामले में, 'snprintf' का उपयोग करें :) लेकिन वास्तव में, आवश्यक बफर आकार की भविष्यवाणी करना कठिन हो सकता है। – tomsmeding

    26

    सी ++ 11, use std::to_string में: अधिक जानकारी के लिए नीचे दिए गए लिंक का पालन करें।

    storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")"; 
    
    संबंधित मुद्दे