Std :: string में int को परिवर्तित करना


143

सबसे छोटा तरीका क्या है, अधिमानतः इनलाइन-सक्षम, एक स्ट्रिंग को एक इंट में बदलने के लिए? स्टाल और बूस्ट का उपयोग करते हुए उत्तर का स्वागत किया जाएगा।



63
C ++ में 11 का उपयोग कर सकते to_stringहै जैसेstd::string s = std::to_string(42)

5
लंबे समय तक C ++ 11 और to_string! :)
Augustin

जवाबों:


351

आप C ++ 11 में std :: to_string का उपयोग कर सकते हैं

int i = 3;
std::string str = std::to_string(i);

4
std :: to_string () MinGW में काम नहीं करता है, अगर किसी को परवाह है।
आर्ची

3
@bparker राइट, यह gcc में तय किया गया है 4.8.0 मुझे लगता है। न्यूनतम कोड के साथ आने वाले मिनगव :: ब्लॉक (13.12) अभी भी 4.7.1 है।
आर्ची


36

boost::lexical_cast<std::string>(yourint) से boost/lexical_cast.hpp

Std :: ostream सपोर्ट के साथ हर चीज के लिए काम करना, लेकिन उतना तेज नहीं है, उदाहरण के लिए, itoa

यहां तक ​​कि यह स्ट्रिंगस्ट्रीम या स्कैनफ से भी तेज प्रतीत होता है:


15
बूस्ट आपका दोस्त है, अगर वहाँ मानक C ++ में ऐसा करने का एक सरल तरीका नहीं था ... मैं निश्चित रूप से क्या lexical_castलाता है जैसे , लेकिन लगता है कि बूस्ट इस तरह के कार्यों के लिए बहुत अधिक है ...
rubenvb

2
Overkill? किस पर आधारित? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
Catskul

अपने दर्शकों को विचार करना चाहिए कि क्या वे
डेमियन

5
"स्टाल और बूस्ट का उपयोग करते हुए उत्तर का स्वागत किया जाएगा।" - दर्शकों ने माना
कॉनराड जोन्स

30

अच्छी तरह से जाना जाता है कि धारा ऑपरेटर का उपयोग कर रहा है:

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

बेशक आप इसे किसी भी प्रकार के लिए टेंप्लेट फंक्शन ^ ^ का उपयोग करके सामान्य कर सकते हैं

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

1
नोट: यह आवश्यक है #include <sstream>
TechNyquist

@TechNyquist: आप सही कह रहे हैं। संकलित होने का मतलब नहीं, लेकिन बदल गया!
न्यूरो

1
तो आप इसका मतलब यह नहीं समझ सकते हैं, लेकिन वास्तव में इसे शामिल करना है :)
TechNyquist

1
@ टेकनेक्विस्ट: हाँ, कुछ के साथ std::;)
न्यूरो

16

यदि आप std::to_stringC ++ 11 से उपयोग नहीं कर सकते हैं , तो आप इसे cppreference.com पर परिभाषित कर सकते हैं:

std::string to_string( int value ) एक हस्ताक्षरित दशमलव पूर्णांक को एक स्ट्रिंग में समान सामग्री के साथ परिवर्तित करता है, जो std::sprintf(buf, "%d", value)पर्याप्त रूप से बड़े बफ़ के लिए उत्पादन करेगा।

कार्यान्वयन

#include <cstdio>
#include <string>
#include <cassert>

std::string to_string( int x ) {
  int length = snprintf( NULL, 0, "%d", x );
  assert( length >= 0 );
  char* buf = new char[length + 1];
  snprintf( buf, length + 1, "%d", x );
  std::string str( buf );
  delete[] buf;
  return str;
}

आप इसके साथ अधिक कर सकते हैं। बस "%g"फ्लोट या डबल को स्ट्रिंग में "%x"बदलने के लिए उपयोग करें, इंट को हेक्स प्रतिनिधित्व में बदलने के लिए उपयोग करें, और इसी तरह।


14

गैर-मानक फ़ंक्शन, लेकिन इसके सबसे आम संकलक पर लागू किया गया:

int input = MY_VALUE;
char buffer[100] = {0};
int number_base = 10;
std::string output = itoa(input, buffer, number_base);

अपडेट करें

C ++ 11 ने कई std::to_stringअतिभारित किए (ध्यान दें कि यह बेस -10 में चूक करता है)।


3
@DevSolar: आपको विस्तृत होना चाहिए। बूस्ट उदाहरण पहले ही दिया जा चुका था। यह समाधान अधिकांश कंपाइलरों पर तब उपलब्ध होता है जब बूस्ट इंस्टॉल नहीं होता है (या आपकी आवश्यकताएं आपको किसी भी कारण से इसका उपयोग करने से रोकती हैं)। ostreamसाथ ही काम करता है, तो आप एक द्विआधारी, अष्टाधारी, या हेक्स प्रारूप के अलावा कुछ के रूप में नंबर-स्ट्रिंग को बचाने की जरूरत है जब तक (जैसे आधार-32)।
ज़ैक हॉवेलैंड

3
मुझे यह पसंद नहीं है जब किसी भी चीज के जवाब के रूप में गैर-मानक कार्य दिए जाते हैं itoa()या stricmp()दिए जाते हैं ।
DevSolar

6
आपकी संवेदनाओं को ठेस पहुंचाने के लिए क्षमा करें, लेकिन मैंने कहा कि यह पहले वाक्य में एक गैर-मानक कार्य था। मैंने इसका उल्लेख नहीं किया है, लेकिन sprintfओपी के लक्ष्य को भी पूरा कर सकता है (हालांकि अभी भी लचीलेपन की कमी से ग्रस्त है अगर आम आधार संख्या के अलावा कुछ भी आवश्यक है)।
जेक हॉवेलैंड

1
हाँ, आपने इसे बताया, और मैंने आपके उत्तर को अस्वीकार नहीं किया, तब भी जब मैंने ऐसा करने के लिए यह किया था। तो मुझे लगता है कि हम भी हैं। ;-)
DevSolar

8

निम्नलिखित मैक्रो एकल-उपयोग के रूप में काफी कॉम्पैक्ट नहीं है ostringstreamयाboost::lexical_cast

लेकिन अगर आपको अपने कोड में बार-बार रूपांतरण-से-स्ट्रिंग की आवश्यकता होती है, तो यह मैक्रो हर बार सीधे स्ट्रिंगस्ट्रीम या स्पष्ट कास्टिंग की तुलना में उपयोग में अधिक सुरुचिपूर्ण होता है।

यह बहुत ही बहुमुखी है, क्योंकि यह समर्थित सभी चीजों को परिवर्तित करता हैoperator<<() संयोजन में भी ।

परिभाषा:

#include <sstream>

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

स्पष्टीकरण:

std::decगुमनाम बनाने के लिए एक पक्ष प्रभाव से मुक्त तरीका है ostringstreamएक सामान्य में ostreamतोoperator<<() समारोह देखने सभी प्रकार के लिए सही ढंग से काम करता है। (यदि आप पहले तर्क सूचक प्रकार हैं, तो आप मुसीबत में पड़ जाते हैं।)

dynamic_castकरने के लिए प्रकार वापस लौट ostringstreamताकि आप कॉल कर सकते हैंstr() उस पर ।

उपयोग:

#include <string>

int main()
{
    int i = 42;
    std::string s1 = SSTR( i );

    int x = 23;
    std::string s2 = SSTR( "i: " << i << ", x: " << x );
    return 0;
}

1
@rubenvb: आप मुझे बताएं कि इसे कैसे टेंप्लेट में बदलना है और मैं सभी C ++ प्रोजेक्ट्स को अपडेट करूंगा, जिनके निर्माण के लिए मैं तैयार हूं।
DevSolar

@rubenvb: क्षमा करें, यह उतना स्पष्ट नहीं था जितना होना चाहिए था। मुझे यह देखने का कोई तरीका नहीं है कि मैं इसे कैसे टेम्पलेट में बदल सकता हूं (C ++ 98 का ​​उपयोग करके) या तो डेज़ी-चेन आउटपुट (मेरे दूसरे उदाहरण के अनुसार) की क्षमता को खोने के बिना, या संभालने के लिए एक जटिल गड़बड़ के साथ आने के बिना। किसी भी संख्या में पैरामीटर और पैरामीटर प्रकार।
देवसोलर

@ डेवलपर: नहीं करेंगे inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }? (परीक्षण नहीं किया गया है, लेकिन मुझे आश्चर्य है कि क्या गलत होगा और क्यों?
rubenvb)

@rubenvb: यह एक व्यक्ति int(मेरा पहला उदाहरण) के लिए करेगा। लेकिन बिना ostreamमें संकलक के लिए दिखाई दे main(के रूप में यह टेम्पलेट समारोह भीतर छिपा हुआ है), उसे ढूंढने की कोशिश करेंगे operator<<()के लिए const char []मेरे दूसरे उदाहरण में - जो croak होगा। मुझे पता है कि ओपी ने केवल एक के लिए कहा था int, लेकिन यह अधिक सामान्य मैक्रो इतना उपयोगी है (और वास्तव में काफी व्यापक है) कि मुझे लगा कि मैं यहां शामिल करूंगा।
देवसोलर

बहुमुखी प्रतिभा के लिए मैं एक टेम्पलेट फ़ंक्शन पसंद करता हूं। डेज़ी-श्रृंखला के लिए शायद आरटीटीआई के एक बिट के साथ एक ही फ़ंक्शन में संभाला जा सकता है ...
न्यूरो

2

आप इस फ़ंक्शन का उपयोग करने के intलिए std::stringबाद में बदलने के लिए उपयोग कर सकते हैं <sstream>:

#include <sstream>

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

0

आप अपने प्रोजेक्ट में इटोआ के कार्यान्वयन को शामिल कर सकते हैं।
यहाँ यह std :: string: http://www.strudel.org.uk/itoa/ के साथ काम करने के लिए संशोधित किया गया है


-2
#include <string>
#include <stdlib.h>

यहाँ int को string में बदलने का एक और आसान तरीका है

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

आप अधिक तरीकों के लिए इस लिंक पर जा सकते हैं https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/


इस मेथडाइडर फ़ाइलों का उपयोग करने के लिए निम्नलिखित शामिल करना होगा #include <string> #include <stdlib.h>
विपुल डुंगरानी

-3

मान लो मेरे पास है integer = 0123456789101112। अब, इस पूर्णांक को stringstreamकक्षा द्वारा एक स्ट्रिंग में परिवर्तित किया जा सकता है ।

यहाँ C ++ में कोड है:

   #include <bits/stdc++.h>
   using namespace std;
   int main()
   {
      int n,i;
      string s;
      stringstream st;
      for(i=0;i<=12;i++)
      {
        st<<i;
      }
      s=st.str();
      cout<<s<<endl;
      return 0;

    }

कई साल पहले ही दिए गए समान लेकिन अधिक पूर्ण उत्तर नहीं थे?
वाल्टर

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