c++ - Std:: स्ट्रिंग और int int को कैसे संयोजित करें?




concatenation stdstring (19)

मैंने सोचा कि यह वास्तव में सरल होगा लेकिन यह कुछ कठिनाइयों को पेश कर रहा है। अगर मेरे पास

std::string name = "John";
int age = 21;

मैं उन्हें एक एकल स्ट्रिंग "John21" प्राप्त करने के लिए कैसे "John21" ?


IOStreams लाइब्रेरी से पार्सिंग और स्वरूपण पहलुओं का उपयोग करके स्ट्रिंग में int को कैसे जोड़ना है, इसका कार्यान्वयन यहां दिया गया है।

#include <iostream>
#include <locale>
#include <string>

template <class Facet>
struct erasable_facet : Facet
{
    erasable_facet() : Facet(1) { }
    ~erasable_facet() { }
};

void append_int(std::string& s, int n)
{
    erasable_facet<std::num_put<char,
                                std::back_insert_iterator<std::string>>> facet;
    std::ios str(nullptr);

    facet.put(std::back_inserter(s), str,
                                     str.fill(), static_cast<unsigned long>(n));
}

int main()
{
    std::string str = "ID: ";
    int id = 123;

    append_int(str, id);

    std::cout << str; // ID: 123
}

Std :: ostringstream एक अच्छी विधि है, लेकिन कभी-कभी यह अतिरिक्त चाल फ़ॉर्मेटिंग को एक-लाइनर में बदलने में आसान हो सकती है:

#include <sstream>
#define MAKE_STRING(tokens) /****************/ \
    static_cast<std::ostringstream&>(          \
        std::ostringstream().flush() << tokens \
    ).str()                                    \
    /**/

अब आप इस तरह के तारों को प्रारूपित कर सकते हैं:

int main() {
    int i = 123;
    std::string message = MAKE_STRING("i = " << i);
    std::cout << message << std::endl; // prints: "i = 123"
}

एक ऐसा कार्य है जिसे मैंने लिखा है, जो int संख्या को पैरामीटर में लेता है, और इसे स्ट्रिंग अक्षर में परिवर्तित करता है, यह फ़ंक्शन किसी अन्य फ़ंक्शन पर निर्भर होता है जो एक अंक को अपने चार समकक्ष में परिवर्तित करता है:

char intToChar ( int num)
{
    if ( num < 10 && num >= 0)
    {
        return num + 48; 
        //48 is the number that we add to an integer number to have its character equivalent (see the unsigned ASCII table)
    }
    else
    {
        return '*';
    }
}

string intToString ( int num)
{
    int digits = 0, process, single;
    string numString;
    process = num;

    //The following process the number of digits in num
    while ( process != 0)
    {
        single  = process % 10; // single now hold the rightmost portion of the int
        process = (process - single)/10;
        // take out the rightmost number of the int ( it's a zero in this portion of the int), then divide it by 10
        // The above combinasion eliminates the rightmost portion of the int
        digits ++;
    }

    process = num;

    //Fill the numString with '*' times digits
    for ( int i = 0; i < digits; i++)
    {
        numString += '*';
    }


    for ( int i = digits-1; i >= 0; i-- )
    {
        single = process % 10;
        numString[i] = intToChar ( single);
        process = ( process - single) / 10;
    }

    return numString;
}

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

name.append(age+"");
cout << name;

क्यूटी से संबंधित प्रश्न इस के पक्ष में बंद कर दिया गया था, यहां क्यूटी का उपयोग करके इसे कैसे किया जाए:

QString string = QString("Some string %1 with an int somewhere").arg(someIntVariable);
string.append(someOtherIntVariable);

स्ट्रिंग वैरिएबल में अब% 1 के स्थान पर कुछ INTVariable का मान है और अंत में कुछ अन्य INTVariable का मान है।


मेरे जैसे लोगों के लिए एक वैकल्पिक समाधान का सुझाव देना जिनके पास सी ++ 11 तक पहुंच नहीं है और अतिरिक्त लाइब्रेरी / हेडर जैसे बूस्ट। एक सरल रूपांतरण इस तरह काम करता है:

उदाहरण संख्या 4 है, 3 को एसीआई में परिवर्तित करने के लिए हम बस कोड का उपयोग कर सकते हैं:
चार ए = '0' + 4

यह तुरंत 4 में एक चरित्र के रूप में स्टोर करेगा।

यहां से, हम बस स्ट्रिंग के बाकी हिस्सों को जोड़ सकते हैं।


मैं एक शुरुआती सी ++ उपयोगकर्ता हूं और इसे सबसे आसान तरीका मिला:

cout << name << age; 

यह नाम और उम्र को सफलतापूर्वक संयोजित करेगा, आउटपुट "जॉन 21" होगा।

हालांकि ऐसा कोई कारण नहीं है कि कोई भी यह नहीं कहता; मुझे लगता है कि इसमें कोई दोष हो सकता है हालांकि मुझे अब तक कोई अनुभव नहीं हुआ है।

संपादित करें: मुझे एहसास हुआ है कि यह जरूरी सही जवाब नहीं है, हालांकि अगर मैं किसी भी सी ++ शुरुआती को जानना चाहता हूं कि कैसे समेकित तारों को आउटपुट करना है, तो मैं इसे यहां रखूंगा।


यदि आप char * आउट प्राप्त करना चाहते हैं, और उपर्युक्त उत्तरदाताओं ने जो रेखांकित किया है उसके अनुसार स्ट्रिंगस्ट्रीम का उपयोग किया है, तो उदाहरण के लिए:

myFuncWhichTakesPtrToChar(ss.str().c_str());

चूंकि str () के माध्यम से स्ट्रिंगस्ट्रीम रिटर्न एक मानक स्ट्रिंग है, तो आप वांछित आउटपुट प्रकार प्राप्त करने के लिए उस पर c_str () को कॉल कर सकते हैं।


यदि आप एमएफसी का उपयोग कर रहे हैं, तो आप एक सीएसटींग का उपयोग कर सकते हैं

CString nameAge = "";
nameAge.Format("%s%d", "John", 21);

प्रबंधित सी ++ में एक स्ट्रिंग फॉर्मेटर भी है।


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

उदाहरण:

std::string name = "John";
int age = 21;

name += std::to_string(age);

std::cout << name;

आउटपुट:

John21

यह सबसे आसान तरीका है:

string s = name + std::to_string(age);

वर्णमाला क्रम में:

std::string name = "John";
int age = 21;
std::string result;

// 1. with Boost
result = name + boost::lexical_cast<std::string>(age);

// 2. with C++11
result = name + std::to_string(age);

// 3. with FastFormat.Format
fastformat::fmt(result, "{0}{1}", name, age);

// 4. with FastFormat.Write
fastformat::write(result, name, age);

// 5. with the {fmt} library
result = fmt::format("{}{}", name, age);

// 6. with IOStreams
std::stringstream sstm;
sstm << name << age;
result = sstm.str();

// 7. with itoa
char numstr[21]; // enough to hold all numbers up to 64-bits
result = name + itoa(age, numstr, 10);

// 8. with sprintf
char numstr[21]; // enough to hold all numbers up to 64-bits
sprintf(numstr, "%d", age);
result = name + numstr;

// 9. with STLSoft's integer_to_string
char numstr[21]; // enough to hold all numbers up to 64-bits
result = name + stlsoft::integer_to_string(numstr, 21, age);

// 10. with STLSoft's winstl::int_to_string()
result = name + winstl::int_to_string(age);

// 11. With Poco NumberFormatter
result = name + Poco::NumberFormatter().format(age);
  1. सुरक्षित है, लेकिन धीमा; Boost (केवल हेडर-केवल) की आवश्यकता है; अधिकांश / सभी प्लेटफ़ॉर्म
  2. सुरक्षित है, सी ++ 11 की आवश्यकता है ( to_string() पहले से ही #include <string> में #include <string>
  3. सुरक्षित है, और तेज़; FastFormat आवश्यकता है, जिसे संकलित किया जाना चाहिए; अधिकांश / सभी प्लेटफ़ॉर्म
  4. सुरक्षित है, और तेज़; FastFormat आवश्यकता है, जिसे संकलित किया जाना चाहिए; अधिकांश / सभी प्लेटफ़ॉर्म
  5. सुरक्षित है, और तेज़; {fmt} लाइब्रेरी की आवश्यकता होती है , जिसे या तो हेडर-केवल मोड में संकलित या उपयोग किया जा सकता है; अधिकांश / सभी प्लेटफ़ॉर्म
  6. सुरक्षित, धीमी, और verbose; #include <sstream> आवश्यकता है (मानक सी ++ से)
  7. भंगुर है (आपको एक बड़ा पर्याप्त बफर चाहिए), तेज़, और वर्बोज़; itoa () एक गैर मानक विस्तार है, और सभी प्लेटफार्मों के लिए उपलब्ध होने की गारंटी नहीं है
  8. भंगुर है (आपको एक बड़ा पर्याप्त बफर चाहिए), तेज़, और वर्बोज़; कुछ भी नहीं चाहिए (मानक सी ++ है); सभी प्लेटफॉर्म
  9. भंगुर है (आपको एक बड़ा पर्याप्त बफर प्रदान करना होगा), शायद सबसे तेज़ संभव रूपांतरण , वर्बोज़; STLSoft (केवल हेडर-केवल) की आवश्यकता है; अधिकांश / सभी प्लेटफ़ॉर्म
  10. सुरक्षित-ईश (आप एक ही कथन में एक से अधिक int_to_string () कॉल का उपयोग नहीं करते हैं), तेज़; STLSoft (केवल हेडर-केवल) की आवश्यकता है; विंडोज केवल
  11. सुरक्षित है, लेकिन धीमा; Boost आवश्यकता Boost ; अधिकांश / सभी प्लेटफ़ॉर्म

सी ++ 11 के बिना, एक छोटी पूर्णांक सीमा के लिए, मैंने पाया कि यह सब मुझे चाहिए:

निम्नलिखित में से कुछ प्रकार की घोषणा / शामिल करें:

const string intToString[10] = {"0","1","2","3","4","5","6","7","8","9"};

फिर:

string str = intToString[3]+" + "+intToString[4]+" = "+intToString[7]; //str equals "3 + 4 = 7"

Enums के साथ भी काम करता है।


सी ++ 11 में, आप std::to_string उपयोग कर सकते हैं, उदाहरण के लिए:

auto result = name + std::to_string( age );


{Fmt} लाइब्रेरी के साथ :

auto result = fmt::format("{}{}", name, age);

लाइब्रेरी का एक सबसेट मानकीकरण के लिए पी 0645 टेक्स्ट स्वरूपण के रूप में प्रस्तावित किया गया है, और यदि स्वीकार किया गया है, तो उपरोक्त बन जाएगा:

auto result = std::format("{}{}", name, age);

अस्वीकरण : मैं {fmt} लाइब्रेरी का लेखक हूं।


#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string itos(int i) // convert int to string
{
    stringstream s;
    s << i;
    return s.str();
}

http://www.research.att.com/~bs/bs_faq2.html से निर्बाध रूप से चुराया गया।


#include <sstream>

template <class T>
inline std::string to_string (const T& t)
{
   std::stringstream ss;
   ss << t;
   return ss.str();
}

फिर आपका उपयोग ऐसा कुछ दिखाई देगा

   std::string szName = "John";
   int numAge = 23;
   szName += to_string<int>(numAge);
   cout << szName << endl;

Googled [और परीक्षण: पी]


std::ostringstream o;
o << name << age;
std::cout << o.str();




stdstring