C ++ में int को स्ट्रिंग में बदलने का सबसे आसान तरीका


1573

C ++ में 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();

4
मुझे लगता है कि आपके द्वारा दिए गए दोनों तरीके अच्छे समाधान हैं। यह उस संदर्भ पर निर्भर करता है जहां आपको इसे करने की आवश्यकता है। यदि आप पहले से ही स्ट्रीम के साथ काम कर रहे हैं, उदाहरण के लिए फ़ाइल पढ़ना या लिखना, तो आपका दूसरा तरीका सबसे अच्छा है। यदि आपको एक फ़ंक्शन तर्क के लिए एक स्ट्रिंग के रूप में एक इंट पास करने की आवश्यकता है, तो इटोआ एक आसान तरीका हो सकता है। लेकिन ज्यादातर समय, फ़ाइलों के साथ काम करते समय इंट टू स्ट्रिंग रूपांतरण होता है, इसलिए स्ट्रीम उपयुक्त हैं।
चार्ल्स ब्रुनेट

41
विकल्प 1 भी आपके लिए कैसे काम करता है? यह मेरी समझ है कि itoa()तीन पैरामीटर हैं।
b1nary.atr0phy

1
समतुल्य धारा के बराबर तेजी से होगा। इटोआ विधि के साथ स्ट्रिंग बफर को फिर से उपयोग करने के तरीके भी हैं (यदि आप बार-बार तार पैदा कर रहे हैं तो ढेर आवंटन से बचें। उदाहरण के लिए कुछ तेजी से अद्यतन संख्यात्मक उत्पादन के लिए)। वैकल्पिक रूप से आप कुछ आवंटन ओवरहेड आदि को कम करने के लिए एक कस्टम स्ट्रीमब्यूफ़ उत्पन्न कर सकते हैं। पहली जगह में स्ट्रीम का निर्माण करना भी कम लागत वाला उद्यम नहीं है।
पीटी

6
@Pete: एक बार जब आप चिंता करना शुरू कर देते हैं कि कौन सा तेज है, तो आप stackoverflow.com/questions/4351371/…
Ben Voigt

20
ध्यान दें कि itoa () मानक का हिस्सा नहीं है और इसलिए इसका उपयोग करने से आपका कोड पोर्टेबल नहीं होता है क्योंकि सभी कंपाइलर इसका समर्थन नहीं करते हैं। लिनक्स के लिए आप निश्चित रूप से बाहर हैं जब तक कि आप जीसीसी के अलावा किसी और चीज का उपयोग नहीं कर रहे हैं, जो इस फ़ंक्शन का समर्थन नहीं करता है। यदि आपके पास C ++ 0x है, तो उसके उत्तर में @Matthieu ने क्या सुझाव दिया है। अगर ऐसा नहीं है, तो यह एक अच्छी तरह से समर्थित सुविधा है और आपका कोड हर C ++ कंपाइलर के साथ संगत होना चाहिए। एक विकल्प के रूप में आप हमेशा स्प्रिंटफ () के साथ जा सकते हैं।
rbaleksandar

जवाबों:


2097

C ++ 11 परिचय std::stoi(और प्रत्येक संख्यात्मक प्रकार के लिए वेरिएंट) और std::to_string, C के समकक्षों 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 )


199
to_stringstdफिक्स का सदस्य नहीं : stackoverflow.com/questions/12975341/…
बेन

36
या आपके कंपाइलर के आधार पर, सही भाषा मानक निर्धारित करें:g++ -std=c++11 someFile.cc
थॉमस एम। डुबिसन

12
@Steve: यह माना जाता है। यह stdहर कंपाइलर का एक सदस्य है जिसे मैं एक को छोड़कर जानता हूं।
मिंग डक

5
@ मैथ्यू एम। मैं वही उपयोग कर रहा हूं जो आप सुझाते हैं लेकिन मुझे यह त्रुटि मिल रही है: Error : No instance of overloaded function "std::to_string" matches the argument list मैं VS2010 c ++

19
@ निर्धारण: VS2010 के तहत आपको स्पष्ट रूप से परिवर्तित पूर्णांक को निम्न में से किसी एक प्रकार में डालना होगा [_Longlong, _ULonglong, long double]; यानी:string s = to_string((_ULonglong)i);
Zac

184

कुछ वर्षों बाद @ v.oddou के साथ एक चर्चा उठाते हुए, C ++ 17 ने अंततः मैक्रो- कुरूपता से गुजरने के बिना मूल रूप से मैक्रो-आधारित प्रकार-अज्ञेय समाधान (नीचे संरक्षित) करने का एक तरीका दिया है ।

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

उपयोग:

int i = 42;
std::string s = sstr( "i is: ", i );
puts( sstr( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) );

मूल उत्तर:

चूंकि "कंवर्टिंग ... टू स्ट्रिंग" एक आवर्ती समस्या है, मैं हमेशा अपने ++ ++ स्रोतों के केंद्रीय हेडर में SSTR () मैक्रो को परिभाषित करता हूं:

#include <sstream>

#define SSTR( x ) static_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

उपयोग जितना आसान हो सकता है:

int i = 42;
std::string s = SSTR( "i is: " << i );
puts( SSTR( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

उपरोक्त C ++ 98 संगत है (यदि आप C ++ 11 का उपयोग नहीं कर सकते हैं std::to_string), और किसी तीसरे पक्ष की आवश्यकता नहीं है (यदि आप बूस्ट का उपयोग नहीं कर सकते हैं lexical_cast<>); इन दोनों अन्य समाधानों का हालांकि बेहतर प्रदर्शन है।


2
मैं इससे बहुत परिचित नहीं dynamic_castहूं लेकिन मैं क्लैग का इस्तेमाल संकलन करने के लिए कर रहा हूं इसलिए यह इसके बारे में शिकायत करता है। अगर मैं अभी चूक करता हूं dynamic_castतो यह ठीक संकलन करता है; dynamic_castइस मामले में क्या उद्देश्य है ? हम पहले से ही एक निर्माण कर रहे हैं ostringstream, इसलिए इसे क्यों डाला?
मैथ्यू

2
@ मैथ्यू: मेरे उत्तर में लिंक निर्माण के प्रत्येक भाग का विस्तृत विवरण देता है। जब हमने एक बनायाostringstream , हमने operator<<()उस पर कॉल किया, जो लौटा ostream &- जिसके लिए .str()परिभाषित नहीं किया गया है। मैं वास्तव में आश्चर्यचकित हूं कि यह काम कलाकारों के बिना कैसे काम करेगा (या यह इसके साथ एक त्रुटि क्यों उत्पन्न करता है)। यह निर्माण कई स्थानों पर प्रकाशित किया गया है, और मैंने कई अलग-अलग संकलकों पर एक दशक से अधिक समय तक इसका उपयोग किया है, जिसमें एमएसवीसी, जीसीसी, और एक्सएलसी शामिल हैं, इसलिए मुझे इस पर आश्चर्य की बात है।
DevSolar

5
बस जिज्ञासा के लिए पार्टी में आए, और नीचा दिखाया। कारण: एक समाधान के लिए बहुत अधिक वोट जो कि अन-एलिगेंट है, और संभावना धीमी है। 1. मैक्रो उपयोग। मैं किसी भी मैक्रो पर व्यवस्थित रूप से नहीं चढ़ता, लेकिन यह एक बहुत छोटा है, और अंत-क्लाइंट हमेशा तर्क के पुनरावृत्ति से डरते हैं, असुरक्षित मल्टीलाइन मैक्रोज़ के लिए डर के ऊपर। (do {} द्वारा संरक्षित नहीं है जबकि (0)) 2. dynam_cast ऐसा लगता है कि आपको यहां केवल एक static_cast की आवश्यकता है, जब तक कि आप यह दावा नहीं करना चाहते कि पुस्तकालय वास्तव में आपके आशा के अनुसार लागू किया गया है। जिस स्थिति में आपको बढ़ावा देना चाहिए :: polymorphic_downcast बजाय।
v.oddou

2
@ v.oddou: आप निश्चित रूप से आलोचना करने के लिए स्वतंत्र हैं। लेकिन 1. अमान्य है - मैक्रो एक एकल कथन है, इसमें do { } while( 0 )कुछ भी नहीं जोड़ा जाएगा। 2. और 3. के साथ आपको संभवतः एक बिंदु मिल गया है - यह एक स्थिर कलाकार के साथ किया जा सकता है, और शायद आप में से एक टेम्पलेट विजार्ड एक "अच्छे" इंटरफ़ेस के साथ आ सकते हैं। लेकिन जैसा कि मैंने कहा, यह किसी भी तरह से खुद का आविष्कार नहीं है। चारों ओर देखो, यह मैक्रो (मैक्रो!) काफी सर्वव्यापी है। यह अपने आप में POLA का मामला है। मैं इसे थोड़ा और अधिक "सुव्यवस्थित" बनाने के लिए खिलौना लगा सकता हूं।
DevSolar

1
@ v.oddou: सी ++ 17 के बीच मुझे जो कुछ मिला, उसे देखिए। :-) मुझे उम्मीद है कि आपको अपडेट किया गया जवाब पसंद आएगा।
देवसोलर

109

मैं आमतौर पर निम्नलिखित विधि का उपयोग करता हूं:

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

यह यहाँ विवरण में वर्णित है


2
उपयोग करने से पहले ss, आपको इसकी आवश्यकता है ss.clear()। मैंने इस आरंभीकरण के बिना अप्रत्याशित परिणाम देखे हैं।
जीवनदायिनी

14
@ जीवनशैली: मैंने ऐसा व्यवहार कभी नहीं देखा।
रसूल

18
@ जीवनशैली: आपको clear()एक नई बनाई गई ostringstreamवस्तु की आवश्यकता नहीं है । clear()त्रुटि / ईओएफ झंडे को रीसेट करता है, और अभी तक कोई त्रुटि / ईओएफ स्थिति उत्पन्न नहीं हुई है।
रेमी लेबेउ

2
@Rasoul NumberToString(23213.123)पैदा करता है 23213.1, जबकि std::to_string(23213.123)उत्पादन करता है 23213.123000वहाँ क्या होता है?
किलोजोन किड

1
@KillzoneKid इसका कारण यह है कि std 'ostream स्टेटफुल हैं (इसका मतलब है कि किसी भी पिछले राज्य परिवर्तन को रखा जाता है, जैसे दशमलव अंकों की संख्या) जबकि यह विधि एक डिफ़ॉल्ट स्थिति से शुरू होती है।
xryl669

85

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

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

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

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

C ++ 11 के अनुसार, std::to_stringपूर्णांक प्रकारों के लिए एक फ़ंक्शन अतिभारित है, इसलिए आप कोड का उपयोग कर सकते हैं:

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

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


2
अच्छा, मैं केविन के जवाब को पसंद करता हूं, हालांकि जैसा कि वह शामिल है और नाम स्थान दिखाता है। बस एक मामूली चपेट में। :) अच्छा काम है, हालांकि!
जेसन आर। मिक

4
मैं कहूंगा कि अगर आपके पास C ++ 11 समर्थन नहीं है तो यह जाने का तरीका है।
एलेक्स

40

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

#include <boost/lexical_cast.hpp>

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

4
बूस्ट इंस्टॉलेशन पर सहमति। मुझे लगता है कि अक्सर एक से अधिक स्ट्रिंग को प्रारूपित करेगा। इस उद्देश्य के लिए मैं बढ़ावा देना पसंद करता हूं :: प्रारूप उदाहरण स्वरूप ("% 02d", संख्या) .str ()
वर्नर इरास्मस

28

स्ट्रिंगस्ट्रीम का उपयोग करना आसान होगा:

#include <sstream>

int x = 42;          // The integer
string str;          // The string
ostringstream temp;  // 'temp' as in temporary
temp << x;
str = temp.str();    // str is 'temp' as string

या एक समारोह बनाओ:

#include <sstream>

string IntToString(int a)
{
    ostringstream temp;
    temp << a;
    return temp.str();
}

18

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

string s = string(itoa(a));

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


55
itoa()एक मानक कार्य नहीं है!
कार्टूनिस्ट

4
@ कार्टूनिस्ट: फिर क्या है?
user541686

20
यह फ़ंक्शन ANSI-C और C ++ में परिभाषित नहीं है। तो यह जी + जैसे कुछ संकलक द्वारा समर्थित नहीं है।
कार्टूनिस्ट

17

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

std::to_string(42);

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

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

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

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

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

ध्यान दें कि दोनों थ्रेड-सुरक्षित हैं।

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

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


2
थ्रेडसेफ़ (री-एंट्रेंट) बने रहने के दौरान कोई डायनेमिक मेमोरी एलोकेशन नहीं होने के दावे के बारे में मैं उत्सुक था, इसलिए मैंने आपका कोड पढ़ा - क्लास के c_str()अंदर घोषित बफर को पॉइंटर लौटाता है fmt::FormatInt- इसलिए पॉइंटर लौटाया गया अमान्य होगा अर्धविराम - भी देखें stackoverflow.com/questions/4214153/lifetime-of-temporaries
सोरेन

1
हां, जैसा व्यवहार std::string::c_str()( वैसे ही नामकरण)। यदि आप इसका उपयोग पूर्ण अभिव्यक्ति के बाहर किसी वस्तु के निर्माण के लिए करना चाहते हैं FormatInt f(42);तो आप f.c_str()इसे नष्ट होने के खतरे के बिना उपयोग कर सकते हैं ।
विट्टुत

1
मुझे कुछ अजीब लगता है जब मैं std :: to_string (संख्या) का उपयोग करके int से स्ट्रिंग में बदलने की कोशिश करता हूं। यदि मैं परिणाम को एक चर में संग्रहीत करता हूं और इसे स्ट्रिंग की तरह एक्सेस करने का प्रयास करता हूं [1] या स्ट्रिंगनाम [एन] के रूप में एन बढ़ता है, तो मुझे कचरा मिलता है।
user8951490

1
यह निश्चित रूप से इस प्रश्न का सही उत्तर है: कुशल और मानक कोड जो स्टेटफुल नहीं है।
xryl669

16

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


1
हे, हाँ। हालांकि, मैं आमतौर पर सी स्ट्रिंग्स को संभालने के दौरान किसी भी परिणाम के लिए स्निपरफ () और दोस्तों पर भरोसा करता हूं।
थ्रोबैक 1986

1
@MatthieuM। आपकी टिप्पणी आगे साबित करती है, कि आप नहीं हैं। यदि इस सीमा के कारण आउटपुट को छोटा कर दिया गया था, तो वापसी मूल्य वर्णों की संख्या (टर्मिनेटिंग नल बाइट को छोड़कर) है, जो पर्याप्त स्थान उपलब्ध होने पर अंतिम स्ट्रिंग को लिखा गया होता। इस प्रकार, आकार का एक वापसी मूल्य या अधिक का मतलब है कि आउटपुट को छोटा कर दिया गया था। तो आप इसे NULLआवश्यक बफर आकार प्राप्त करने के लिए एक और शून्य आकार के साथ कहते हैं ।
user1095108

2
@ user1095108: मुझे लगता है कि आप गलत हैं snprintf( एसएनपी उपसर्ग पर sprintfध्यान दें ) और ( एसपी उपसर्ग पर ध्यान दें )। आप आकार को पूर्व में पास करते हैं, और यह अतिप्रवाह नहीं होने का ख्याल रखता है, हालांकि बाद वाला बफर के आकार को नहीं जानता है और इस तरह से अतिप्रवाह हो सकता है।
मैथ्यू एम।

1
विचार यह है कि snprintfपहले एक sprintfसंस्करण और उसके बाद एक संस्करण को बुलाया जाए । जैसे-जैसे बफर आकार ज्ञात होता है, तब तक कॉलिंग sprintfपूरी तरह से सुरक्षित हो जाती है।
user1095108

1
@ user1095108 आह, हां। यदि स्निपरफ के लिए पहला बफर अपर्याप्त है, तो रिटर्न मूल्य आपको बताता है कि क्या पर्याप्त होगा। मैं अभी भी दूसरी कॉल के लिए स्निपरफ का उपयोग करूंगा, क्योंकि स्प्रिंटफ और स्निपरफ को मैच के लिए लागू करना अनावश्यक रूप से खतरनाक है।
शुभम

11

पहले शामिल करें:

#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!."

10

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

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

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

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

इसलिए मैं जोरदार std::to_stringतरीके से इस्तेमाल करने की सलाह दूंगा । यह आसान है और वही करता है जो आप उम्मीद करते हैं।

अपडेट किया गया (नीचे टिप्पणी देखें) :

C ++ 17 std::to_charsएक उच्च-प्रदर्शन स्थानीय-स्वतंत्र विकल्प के रूप में प्रदान करता है


2
मैं मानता हूं कि यह एक गंभीर समस्या है यदि आपको डेटा का आदान-प्रदान करने की आवश्यकता है। दुर्भाग्य से, std::to_stringवर्तमान लोकेल ( en.cppreference.com/w/cpp/string/basic_string/to_string , 'नोट्स' अनुभाग) का भी उपयोग करता है । लगभग सभी मानक उपकरण (स्ट्रिंगस्ट्रीम से sprintf, लेकिन sscanfआदि तक) वर्तमान लोकेल का उपयोग कर रहे हैं। मुझे इस बारे में तब तक जानकारी नहीं थी जब हाल ही में इसने मुझे बहुत मारा। वर्तमान में घर के बने सामान का उपयोग करना, बनाना मुश्किल नहीं है।
बर्ट ब्रिल

ऊपर दिए गए लिंक में यह भी बताया गया है कि C ++ 17 उच्च प्रदर्शन वाले लोकल-इंडिपेंडेंट विकल्प के रूप में std :: to_chars प्रदान करता है।
YesThatIsMyName

दुर्भाग्य से, मैं आने वाले वर्ष के लिए सी ++ 11 के साथ फंस गया हूं (काफी सुधार, पहले से ही, सौभाग्य से)।
बर्ट ब्रिल

1
from_chars और to_chars एकदम सही होंगे, लेकिन दुर्भाग्य से उन्होंने wchar_t वैरिएंट पेश नहीं किया।
Gast128

8

C ++ 98 के लिए , कुछ विकल्प हैं:

boost/lexical_cast

बूस्ट C ++ लाइब्रेरी का हिस्सा नहीं है, लेकिन इसमें कई उपयोगी लाइब्रेरी एक्सटेंशन हैं।

lexical_castसमारोह टेम्पलेट के लिए और मनमाने ढंग से प्रकार जब वे पाठ के रूप में प्रतिनिधित्व कर रहे हैं से आम रूपांतरण समर्थन करने के लिए एक सुविधाजनक और सुसंगत रूप प्रदान करता है।
- बूस्ट डॉक्यूमेंटेशन

#include "boost/lexical_cast.hpp"
#include <string>

int main() {
    int x = 5;
    std::string x_str = boost::lexical_cast<std::string>(x);
    return 0;
}

रनटाइम के लिए, lexical_castऑपरेशन में पहले रूपांतरण पर लगभग 80 माइक्रोसेकंड (मेरी मशीन पर) लगते हैं, और फिर बाद में अगर यह बहुत तेजी से किया जाता है, तो गति बढ़ जाती है।


itoa

यह फ़ंक्शन ANSI-C में परिभाषित नहीं है और C ++ का हिस्सा नहीं है, लेकिन कुछ संकलक द्वारा समर्थित है।
- cplusplus.com

इसका मतलब है कि कोड का उपयोग नहीं कर सकते gcc/ g++कर सकते हैं itoa

#include <stdlib.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    x_str = itoa(x, x_str, 10); // base 10
    return 0;
}

रिपोर्ट करने का कोई क्रम नहीं। मेरे पास विजुअल स्टूडियो स्थापित नहीं है, जो कथित तौर पर संकलन करने में सक्षम है itoa


sprintf

sprintf एक C मानक लाइब्रेरी फ़ंक्शन है जो C स्ट्रिंग्स पर काम करता है, और एक पूरी तरह से वैध विकल्प है।

उसी पाठ के साथ एक स्ट्रिंग की रचना करता है जो प्रिंटफ़ पर प्रारूप का उपयोग करने पर मुद्रित किया जाएगा, लेकिन मुद्रित होने के बजाय, सामग्री को स्ट्रिंग द्वारा इंगित बफर में सी स्ट्रिंग के रूप में संग्रहीत किया जाता है।
- cplusplus.com

#include <stdio.h>

int main() {
    int x = 5;
    char * x_str = new char[2];
    int chars_written = sprintf(x_str, "%d", x);
    return 0;
}

stdio.hशीर्ष लेख आवश्यक नहीं हो सकता। रनटाइम के लिए, sprintfऑपरेशन पहले रूपांतरण पर लगभग 40 माइक्रोसेकंड (मेरी मशीन पर) लेता है, और फिर बाद में अगर यह बहुत तेजी से किया जाता है, तो गति बढ़ाता है।


stringstream

यह C ++ लाइब्रेरी का पूर्णांक स्ट्रिंग्स में कनवर्ट करने का मुख्य तरीका है, और इसके विपरीत। बहन के समान कार्य हैं stringstreamजो स्ट्रीम के इच्छित उपयोग को और सीमित करते हैं, जैसे कि ostringstream। का उपयोग करते हुए ostringstreamविशेष रूप से अपने कोड के पाठक को बताता है कि आप केवल <<ऑपरेटर का उपयोग करना चाहते हैं , अनिवार्य रूप से। यह फ़ंक्शन एक पूर्णांक को स्ट्रिंग में बदलने के लिए विशेष रूप से आवश्यक है। अधिक विस्तृत चर्चा के लिए इस प्रश्न को देखें ।

#include <sstream>
#include <string>

int main() {
    int x = 5;
    std::ostringstream stream;
    stream << x;
    std::string x_str = stream.str();
    return 0;
}

रनटाइम के लिए, ostringstreamऑपरेशन लगभग 71 माइक्रोसेकंड (मेरी मशीन पर) लेता है, और फिर बाद में तेजी से गति करता है यदि अनावश्यक रूप से किया जाता है, लेकिन पिछले कार्यों जितना नहीं


बेशक अन्य विकल्प भी हैं, और आप इनमें से किसी एक को अपने स्वयं के फ़ंक्शन में भी लपेट सकते हैं, लेकिन यह कुछ लोकप्रिय लोगों को एक विश्लेषणात्मक रूप प्रदान करता है।


हमें देखने के लिए धन्यवाद (C ++ 98 उपयोगकर्ता)
A. B

@AB मैं अभी भी किसी भी C ++ 98 उपयोगकर्ताओं को नहीं छोड़ रहा हूँ।
कोटसकस

@VladislavToncharov जब आपकी नौकरी पूरी तरह से विरासत के उपकरण और कोड का समर्थन करने के लिए है, तो आप नए उद्योग मानकों का उपयोग करते हुए पुराने सामान में मिलेंगे। एक गर्मी से पहले, मैं पायथन 2.3 में कोड लिख रहा था।
जोशुआ डेटेलर

@JoshuaDetwiler ओह, इसके बारे में भूल गया, क्षमा करें।
कोटुस्कास

4

C ++ 17 एक उच्च-प्रदर्शन स्थानीय-स्वतंत्र विकल्प के रूप में std :: to_chars प्रदान करता है ।


3

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

#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;
}

2

संपादित। यदि आपको पूर्णांक संख्याओं के एक निश्चित संख्या के साथ पूर्णांक के तेजी से रूपांतरण की आवश्यकता है, तो * 0 'के साथ बाएं-पैडेड , यह छोटे-एंडियन आर्किटेक्चर (सभी x86, x86_64 और अन्य) के लिए उदाहरण है:

यदि आप दो अंकों की संख्या को परिवर्तित कर रहे हैं:

int32_t s = 0x3030 | (n/10) | (n%10) << 8;

यदि आप तीन-अंकीय संख्या परिवर्तित कर रहे हैं:

int32_t s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

यदि आप चार अंकों की संख्या में परिवर्तित कर रहे हैं:

int64_t s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

और इसलिए सात अंकों की संख्या तक। इस उदाहरण nमें एक दिया गया पूर्णांक है। रूपांतरण के बाद इसे स्ट्रिंग प्रतिनिधित्व के रूप में एक्सेस किया जा सकता है (char*)&s:

std::cout << (char*)&s << std::endl;

नोट: यदि आपको बड़े-एंडियन बाइट ऑर्डर पर इसकी आवश्यकता है, हालांकि मैंने इसका परीक्षण नहीं किया है, लेकिन यहां एक उदाहरण है: तीन अंकों की संख्या के लिए यह int32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8;चार अंकों की संख्या (64 बिट आर्क) के लिए है: int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32;मुझे लगता है कि इसे काम करना चाहिए।


2
बाइट-ऑर्डर के बारे में क्या?
शेजेफ

क्या यह सूचक अलियासिंग के कारण अपरिभाषित व्यवहार नहीं है?
dgnuff

1
@ शेजेफ ने टिप्पणी के लिए धन्यवाद, मैंने उत्तर के लिए धीरज पर एक नोट जोड़ा।
Alek

@dgnuff इसे इंगित करने के लिए धन्यवाद, हालाँकि मुझे इससे कोई समस्या नहीं है, आप सही हैं। मैंने उत्तर को थोड़ा संशोधित किया ताकि यह सख्त अलियासिंग नियमों का अनुपालन करे, धन्यवाद।
अल्पविराम

1

उपयोग:

#define convertToString(x) #x

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

3
केवल शाब्दिक संख्याओं के साथ काम करता है, चर सामग्री का मूल्यांकन नहीं करता है, हालांकि कभी-कभी उपयोगी होता है।
वुल्फ

सही। लेकिन समय पर निश्चित रूप से काम
maverick9888

1
केवल शाब्दिक स्थिरांक संख्याओं के साथ संकलन समय पर काम करता है, मुझे लगता है कि ओपी एक गतिशील रूपांतरण के लिए पूछता है, चर पूर्णांक
आईएनजी

0

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

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();

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


0

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

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

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

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


0

यह मेरे लिए काम किया -

मेरा कोड:

#include <iostream>
using namespace std;

int main()
{
    int n = 32;
    string s = to_string(n);
    cout << "string: " + s  << endl;
    return 0;
}

अनिवार्य रूप से क्या उपयोग कर रहा है? stringstream?
पीटर मोर्टेंसन

@PeterMortensen ध्यान से देखिए, यह हैstd::to_string()
कोटसकस

मेरे पास using namespace std;:)
गोंकेलो गैरिडो

0

std::to_string()संख्यात्मक प्रकारों के लिए C ++ 11 पेश किया गया:

int n = 123; // Input, signed/unsigned short/int/long/long long/float/double
std::string str = std::to_string(n); // Output, std::string

4
नमस्ते! क्या आप इस बारे में स्पष्टीकरण जोड़ सकते हैं कि यह प्रश्न का उत्तर क्यों और कैसे प्रदान करता है?
जुन्नोड

0

उपयोग:

#include<iostream>
#include<string>

std::string intToString(int num);

int main()
{
    int integer = 4782151;

    std::string integerAsStr = intToString(integer);

    std::cout << "integer = " << integer << std::endl;
    std::cout << "integerAsStr = " << integerAsStr << std::endl;

    return 0;
}

std::string intToString(int num)
{
    std::string numAsStr;

    while (num)
    {
        char toInsert = (num % 10) + 48;
        numAsStr.insert(0, 1, toInsert);

        num /= 10;
    }
    return numAsStr;
}

1
पूरी तरह से n≤0 के लिए विफल रहता है
टोबी स्पाइट

-1
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;
}

1
इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित अल्पकालिक सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह दिखाते हुए इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा , और यह भविष्य के पाठकों को अन्य, समान प्रश्नों के साथ और अधिक उपयोगी बना देगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
टोबे स्पाइट

पूरी तरह से n≤0 के लिए विफल रहता है
टोबी स्पाइट

टिप्पणी जोड़ें, अपना उत्तर स्पष्ट करें, उत्तर देने का तरीका पढ़ें ।
अक्षेन पी

-1

यदि आप MFC का उपयोग कर रहे हैं , तो आप उपयोग कर सकते हैं CString:

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

8
आपको ध्यान देना चाहिए कि यह एक Microsoft- केवल एक्सटेंशन है: msdn.microsoft.com/en-us/library/ms174288.aspx
JonnyJD

1
मुझे CString का विचार पसंद है :: प्रारूप ()। दुर्भाग्य से यह केवल गैर पोर्टेबल एमएस है।
निक

1
मैंने अपनी टिप्पणी @JonnyJD से जानकारी शामिल करने के लिए अपने उत्तर को अपडेट कर दिया है, क्योंकि मैं 5 साल बाद इसके लिए कम हो रहा हूं ..
Tur1ng

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

12
लीक्स मेमोरी, -1 मेरे से
पॉलम

यह बफर ओवररन की तरह खुशबू आ रही है।
कोटसुकस

-2
namespace std
{
    inline string to_string(int _Val)
    {   // Convert long long to string
        char _Buf[2 * _MAX_INT_DIG];
        snprintf(_Buf, "%d", _Val);
        return (string(_Buf));
    }
}

अब आप उपयोग कर सकते हैं to_string(5)


10
जबकि यह समाधान काम करता है, यह अत्यधिक हतोत्साहित है! अंडरस्कोर और एक कैपिटल लेटर के साथ शुरू होने वाले नाम कंपाइलर के लिए आरक्षित हैं, आपको कभी भी इनका उपयोग नहीं करना चाहिए। stdनाम स्थान में कार्य करना कुछ ऐसा नहीं है जो आपको कभी भी करना चाहिए। इसके अलावा, ऐसा नहीं लगता है _MAX_INT_DIGकि एक मानक मैक्रो है, इसलिए यदि इसे गलत तरीके से परिभाषित किया गया है, तो इस कोड में अपरिभाषित व्यवहार को प्रेरित करने की महान क्षमता है। -1
iFreilicht

6
_MAX_INT_DIG क्या है और यह दोगुना क्यों है?
पॉलम

-2

मुझे लगता है कि प्रयोग stringstreamकरना बहुत आसान है:

 string toString(int n)
 {
     stringstream ss(n);
     ss << n;
     return ss.str();
 }

 int main()
 {
    int n;
    cin >> n;
    cout << toString(n) << endl;
    return 0;
 }

यह सवाल में उल्लेख किया गया था, और दुर्भाग्य से काफी धीमा है।
कोटसकस

-3

स्ट्रिंग में कनवर्ट करने के लिए आप काउंटर प्रकार के एल्गोरिथ्म का उपयोग करते हैं। मुझे यह तकनीक प्रोग्रामिंग कमोडोर 64 कंप्यूटर से मिली । यह गेम प्रोग्रामिंग के लिए भी अच्छा है।

  • आप पूर्णांक लेते हैं और प्रत्येक अंक को 10 की शक्तियों से भारित करते हैं। तो मान लें कि पूर्णांक 950 है।

    • यदि पूर्णांक बराबर है या 100,000 से अधिक है, तो 100,000 को घटाएं और ["000000"] स्ट्रिंग में काउंटर बढ़ाएं;
      तब तक करते रहें जब तक कि स्थिति में अधिक संख्या 100,000 न हो। दस की एक और शक्ति गिराओ।

    • यदि पूर्णांक बराबर है या 10,000 से अधिक है, तो 10,000 घटाएं और स्ट्रिंग को काउंटर में बढ़ाएं ["000000"] + 1 स्थिति;
      इसे तब तक करते रहें जब तक कि 10,000 की संख्या में कोई संख्या न हो।

  • दस की एक और शक्ति गिराओ

  • पैटर्न को दोहराएं

मुझे पता है कि 950 उदाहरण के रूप में उपयोग करने के लिए बहुत छोटा है, लेकिन मुझे आशा है कि आपको यह विचार मिलेगा।


कोड में एक उदाहरण दिखाने के बजाय, एक एल्गोरिथ्म का वर्णन करना बहुत उपयोगी नहीं है।
cdeerinck
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.