c++ - सी++ में int को स्ट्रिंग में कनवर्ट करने का सबसे आसान तरीका




string type-conversion (15)

सी ++ में int से समकक्ष string में कनवर्ट करने का सबसे आसान तरीका क्या है। मुझे दो तरीकों से अवगत है। क्या कोई आसान तरीका है?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

यहां करने का एक और आसान तरीका है

char str[100] ; 
sprintf(str , "%d" , 101 ) ;  
string s = str; 

sprintf किसी भी डेटा को आवश्यक प्रारूप की स्ट्रिंग में डालने के लिए एक प्रसिद्ध व्यक्ति है।

आप तीसरे पंक्ति में दिखाए गए अनुसार स्ट्रिंग में चार * सरणी को कन्वर्ट कर सकते हैं।


आप Matthieu एम द्वारा सुझाए गए अनुसार C ++ 11 में उपलब्ध std::to_string उपयोग कर सकते हैं:

std::to_string(42);

या, यदि प्रदर्शन महत्वपूर्ण है (उदाहरण के लिए, यदि आप बहुत सारे रूपांतरण करते हैं), तो आप एक पूर्णांक को std::string कनवर्ट करने के लिए C ++ प्रारूप लाइब्रेरी से fmt::FormatInt उपयोग कर सकते हैं:

fmt::FormatInt(42).str();

या एक सी स्ट्रिंग:

fmt::FormatInt f(42);
f.c_str();

उत्तरार्द्ध कोई गतिशील स्मृति आवंटन नहीं करता है और बूस्ट कर्म बेंचमार्क पर std::to_string से 10 गुना अधिक तेज़ है। अधिक जानकारी के लिए सी ++ में स्ट्रिंग रूपांतरण के लिए तेज़ पूर्णांक देखें।

std::to_string विपरीत, fmt::FormatInt को C ++ 11 की आवश्यकता नहीं है और किसी भी C ++ कंपाइलर के साथ काम करता है।

अस्वीकरण: मैं सी ++ प्रारूप पुस्तकालय के लेखक हूं।


उपयोग:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}

कुछ वाक्य रचनात्मक चीनी जोड़ने के लिए यह आसान है जो किसी को फ्लाई पर तारों को एक धारा-तरह से लिखने की अनुमति देता है

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

अब आप जो कुछ भी चाहते हैं उसे जोड़ सकते हैं (बशर्ते कि एक ऑपरेटर << (std::ostream& ..) लिए परिभाषित किया गया हो) strmake() और std::string स्थान पर इसका उपयोग करें।

उदाहरण:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}

पहले शामिल हैं:

#include <string>
#include <sstream>

दूसरा तरीका जोड़ें:

template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

इस तरह की विधि का प्रयोग करें:

NumberToString(69);

या

int x = 69;
string vStr = NumberToString(x) + " Hello word!."

मुझे नहीं पता कि शुद्ध सी ++ में। लेकिन आपने जो उल्लेख किया है उसका थोड़ा सा संशोधन

string s = string(itoa(a));

काम करना चाहिए, और यह बहुत छोटा है।


मैं उपयोग करता हूं:

int myint = 0;
long double myLD = 0.0;

string myint_str = static_cast<ostringstream*>( &(ostringstream() << myint) )->str();
string myLD_str = static_cast<ostringstream*>( &(ostringstream() << myLD) )->str();

यह मेरी विंडोज़ और लिनक्स जी ++ कंपाइलर्स पर काम करता है।


यदि आपके पास बूस्ट स्थापित है (जो आपको करना चाहिए):

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);

शायद सबसे आम आसान तरीका lexical_cast नामक टेम्पलेट में अनिवार्य रूप से आपकी दूसरी पसंद को लपेटता है, जैसे Boost में से एक, इसलिए आपका कोड इस तरह दिखता है:

int a = 10;
string s = lexical_cast<string>(a);

इसका एक निपुणता यह है कि यह अन्य जानवरों का भी समर्थन करता है (उदाहरण के लिए, विपरीत दिशा में भी काम करता है)।

यह भी ध्यान रखें कि हालांकि बूस्ट लेक्सिकल_कास्ट सिर्फ एक स्ट्रिंगस्ट्रीम को लिखने के रूप में शुरू हुआ, फिर स्ट्रीम से बाहर निकालने के बाद, इसमें अब कुछ जोड़े हैं। सबसे पहले, कुछ प्रकार के लिए विशेषज्ञताएं जोड़ दी गई हैं, इसलिए कई सामान्य प्रकारों के लिए, यह स्ट्रिंगस्ट्रीम का उपयोग करने से काफी तेज है। दूसरा, अब यह परिणाम जांचता है, इसलिए (उदाहरण के लिए) यदि आप किसी स्ट्रिंग से int कनवर्ट करते हैं, तो स्ट्रिंग में ऐसा कुछ अपवाद फेंक सकता है जिसे किसी int परिवर्तित नहीं किया जा सकता है (उदाहरण के लिए, 1234 सफल होगा, लेकिन 123abc फेंक देगा)।

सी ++ 11 के रूप में, एक std::to_string फ़ंक्शन पूर्णांक प्रकारों के लिए ओवरलोड किया गया है, ताकि आप कोड का उपयोग कर सकें:

int a = 20;
std::string s = to_string(a);

मानक इन्हें sprintf साथ रूपांतरण करने के बराबर के रूप में परिभाषित करता है (रूपांतरण विनिर्देशक का उपयोग करके जो वस्तु के आपूर्ति प्रकार से मेल खाता है, जैसे कि %d int ), पर्याप्त आकार के बफर में, फिर एक std::string बनाना उस बफर की सामग्री।


सी ++ 11 std::stoi (और प्रत्येक संख्यात्मक प्रकार के लिए वेरिएंट) और std::to_string , सी atoi और itoa के समकक्ष प्रस्तुत करता है लेकिन std::string की अवधि में व्यक्त किया गया है।

#include <string> 

std::string s = std::to_string(42);

इसलिए मैं सबसे छोटा रास्ता सोच सकता हूं। auto कीवर्ड का उपयोग करके आप नाम का नामकरण भी छोड़ सकते हैं:

auto s = std::to_string(42);

नोट: [string.conversions] देखें ( n3242 में 21.5 )


CString का उपयोग करना:

int a = 10;
CString strA;
strA.Format("%d", a);

sprintf() प्रारूप रूपांतरण के लिए बहुत अच्छा है। इसके बाद आप परिणामी सी स्ट्रिंग को C ++ स्ट्रिंग में असाइन कर सकते हैं जैसा आपने 1 में किया था।


संख्या रूपांतरण के लिए स्ट्रिंगस्ट्रीम का उपयोग करना खतरनाक है!

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ देखें जहां यह operator<< बताता है operator<< स्वरूपित आउटपुट सम्मिलित करता है।

आपके वर्तमान लोकेल के आधार पर 3 अंकों से अधिक एक पूर्णांक, एक अतिरिक्त हजारों विभाजक जोड़ने, 4 अंकों की एक स्ट्रिंग में परिवर्तित हो सकता है।

उदाहरण के लिए, int = 1000 1.001 स्ट्रिंग 1.001 परिवर्तित किया जा सकता है। यह तुलना संचालन बिल्कुल काम नहीं कर सकता है।

तो मैं std::to_string तरीके का उपयोग करने की दृढ़ता से अनुशंसा करता std::to_string । यह आसान है और आप जो उम्मीद करते हैं वह करता है।


char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs,"%d",timeStart.elapsed()/1000);
sprintf(bufMs,"%d",timeStart.elapsed()%1000);

string number_to_string(int x){
    if(!x) return "0";
        string s,s2;
        while(x){
            s.push_back(x%10 + '0');
            x/=10;
        }
    reverse(s.begin(),s.end());
    return s;
}






type-conversion