কিভাবে একটি স্টাড :: স্ট্রিং এবং একটি int সংযুক্ত করতে?


655

আমি ভেবেছিলাম এটি সত্যিই সহজ হবে তবে এটি কিছু অসুবিধা উপস্থাপন করছে। যদি আমার থাকে

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

একটি স্ট্রিং পেতে আমি কীভাবে তাদের একত্র করব "John21"?


ভেষজ সুতারের এই বিষয়ে একটি ভাল নিবন্ধ রয়েছে: "স্ট্যান্ট ফরমেটারস অফ ম্যানোর ফার্ম" । তিনি জুড়ে Boost::lexical_cast, std::stringstream, std::strstream(যা অবচিত), এবং sprintfবনাম snprintf
ফ্রেড লারসন

আমাকে এটি যুক্ত করতে দিন: আমি চেষ্টা করেছি 'str = "হাই"; str + = 5; cout << স্ট্রিং; ' এবং কোন প্রভাব দেখেনি। এই কলগুলি অপারেটরকে + = (চর) দেখাবে এবং একটি মুদ্রণযোগ্য অক্ষর যুক্ত করে।
daveagp

উত্তর:


1125

বর্নানুক্রমে:

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. নিরাপদ তবে ধীর; বুস্টের প্রয়োজন (কেবলমাত্র শিরোনাম); সর্বাধিক / সমস্ত প্ল্যাটফর্ম
  2. নিরাপদ, সি ++ 11 প্রয়োজন ( টু স্ট্রিং () ইতিমধ্যে এতে অন্তর্ভুক্ত রয়েছে #include <string>)
  3. নিরাপদ এবং দ্রুত; ফাস্টফর্ম্যাট প্রয়োজন , যা অবশ্যই সংকলন করা উচিত; সর্বাধিক / সমস্ত প্ল্যাটফর্ম
  4. ( দিতো )
  5. নিরাপদ এবং দ্রুত; প্রয়োজন {FMT} গ্রন্থাগার , যা হয় কম্পাইল বা হেডার শুধুমাত্র মোডে ব্যবহার করা যেতে পারে; সর্বাধিক / সমস্ত প্ল্যাটফর্ম
  6. নিরাপদ, ধীর এবং ভার্বোজ; প্রয়োজন #include <sstream>(স্ট্যান্ডার্ড সি ++ থেকে)
  7. ভঙ্গুর (আপনাকে অবশ্যই যথেষ্ট পরিমাণে বড় বাফার সরবরাহ করতে হবে), দ্রুত এবং শব্দচোষ; itoa () একটি মানহীন এক্সটেনশন, এবং সমস্ত প্ল্যাটফর্মের জন্য উপলব্ধ থাকার গ্যারান্টিযুক্ত নয়
  8. ভঙ্গুর (আপনাকে অবশ্যই যথেষ্ট পরিমাণে বড় বাফার সরবরাহ করতে হবে), দ্রুত এবং শব্দচোষ; কিছুই প্রয়োজন হয় না (স্ট্যান্ডার্ড সি ++); সমস্ত প্ল্যাটফর্ম
  9. ভঙ্গুর (আপনাকে অবশ্যই একটি বৃহত পরিমাণ যথেষ্ট বাফার সরবরাহ করতে হবে), সম্ভবত দ্রুততম সম্ভব রূপান্তর , ভার্বোস; এসটিএলসফ্টের প্রয়োজন (কেবলমাত্র শিরোনাম); সর্বাধিক / সমস্ত প্ল্যাটফর্ম
  10. নিরাপদ- ish (আপনি এক বিবৃতিতে একাধিক int_to_string () কল ব্যবহার করবেন না ), দ্রুত; এসটিএলসফ্টের প্রয়োজন (কেবলমাত্র শিরোনাম); উইন্ডোজ অনলি
  11. নিরাপদ তবে ধীর; পোকো সি ++ প্রয়োজন ; সর্বাধিক / সমস্ত প্ল্যাটফর্ম

13
আপনি যে লিঙ্কটি gfiven করেছেন তা বাদে আপনি কীভাবে আপনার পারফরম্যান্সের মন্তব্যগুলি ভিত্তি করছেন?
জেমিএইচ

2
এটি একটি উত্তর থেকে আপনার সম্পূর্ণ খ্যাতি !! আপনি ভাগ্যবান শিম;) আমি মনে করি 8 টি স্ট্যান্ডার্ড সি (অবশ্যই সি ++), তবে সম্ভবত এটির মধ্যে পার্থক্য রয়েছে।
নোলিস

২.এসডি হিসাবে :: ধীরে ধীরে: টু স্ট্রিং (বয়স) একটি অস্থায়ী স্ট্রিং তৈরি করে যা ফলাফলের সাথে যুক্ত হয়।
ইগোর বুকানভ

আপনি যদি আরডুইনোতে থাকেন তবে আপনি এটি ব্যবহার করতে পারেন String(number)
মাচাডো


85

আপনার যদি বুস্ট থাকে তবে আপনি ব্যবহার করে পূর্ণসংখ্যাকে একটি স্ট্রিংয়ে রূপান্তর করতে পারেন boost::lexical_cast<std::string>(age)

আর একটি উপায় স্ট্রিংস্ট্রিম ব্যবহার করা:

std::stringstream ss;
ss << age;
std::cout << name << ss.str() << std::endl;

তৃতীয় পন্থাটি ব্যবহার করতে হবে sprintfবা snprintfসি লাইব্রেরি থেকে।

char buffer[128];
snprintf(buffer, sizeof(buffer), "%s%d", name.c_str(), age);
std::cout << buffer << std::endl;

অন্যান্য পোস্টার ব্যবহারের পরামর্শ দিয়েছে itoa। এটি কোনও স্ট্যান্ডার্ড ফাংশন নয়, সুতরাং আপনি যদি এটি ব্যবহার করেন তবে আপনার কোড পোর্টেবল হবে না। এমন সংকলক রয়েছে যা এটি সমর্থন করে না।


নোট করুন যে স্নিপ্রিন্টফ স্ট্রিংটি নাল-টার্মিনেট করার গ্যারান্টিযুক্ত নয়। এটি কাজ করে তা নিশ্চিত করার জন্য এখানে একটি উপায়: <পছন্দ> চর বাফার [128]; বাফার [মাপের (বাফার) -1] = '\ 0'; স্নিপ্রিন্টফ (বাফার, মাপের (বাফার) -1, "% s% d", নাম। std :: cout << বাফার << স্টাড :: এন্ডল; </
translation

আমার প্রবণতাটি কখনও স্প্রিন্টফ ব্যবহার না করা, যেহেতু এর ফলে বাফার-ওভারফ্লো হতে পারে। উপরের উদাহরণটি একটি ভাল উদাহরণ যেখানে নামটি দীর্ঘকালীন থাকলে স্প্রিন্টফ ব্যবহার করা অনিরাপদ ছিল।
টারসন

নোট করুন যে স্নিপ্রিন্টফ সমান অ-মানক সি ++ (এটির মতো যা আপনি উল্লেখ করেছেন)। এটি
সি 99

@ ওটারসন: আমি sprintfউত্তরের কোনও ঘটনা দেখছি না , কেবলমাত্র snprintf
ডেভিড ফোস্টার 18


52
#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 থেকে নির্লজ্জভাবে চুরি ।


তবে s এটি একটি স্ট্যাক ভেরিয়েবল, sঅনুরোধের পরে স্মৃতি মুক্ত থাকবে itossগাদা থেকে বরাদ্দ করা উচিত, এবং freeব্যবহারের পরে, ঠিক?
কেজবুক

1
মান রিটার্ন ঠিক আছে যদিও স্ট্রিং অবজেক্ট সুযোগ মধ্য থেকে বের হয়ে stackoverflow.com/a/3977119/5393174
kgbook


23

আপনার যদি সি ++ 11 থাকে তবে আপনি ব্যবহার করতে পারেন std::to_string

উদাহরণ:

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

name += std::to_string(age);

std::cout << name;

আউটপুট:

John21

2
এটা হবে name += std::to_string(static_cast<long long>(age));একজন উপাচার্য ++, 2010 হিসাবে আপনি দেখতে পারেন এখানে
neonmate

name += std::to_string(age + 0LL);পরিবর্তে কীভাবে ?
chux - মনিকা 19 ই

18

আমার কাছে মনে হয়েছে যে সহজ উত্তরটি হ'ল sprintfফাংশনটি ব্যবহার করা :

sprintf(outString,"%s%d",name,age);

1
স্নিপ্রিন্টফ জটিল হতে পারে (মূলত এটি নির্দিষ্ট পরিস্থিতিতে নাল চরিত্রকে অন্তর্ভুক্ত করতে পারে না কারণ) তবে স্প্রিন্টফ বাফার ওভারফ্লোগুলি সম্ভাব্য সমস্যাগুলি এড়াতে আমি পছন্দ করি।
টারসন

3
আপনি যখন স্টাড :: স্ট্রিংকে% s তে পাস করবেন তখন স্প্রিন্টফ (চর *, কনস্ট চর *, ...) সংকলকগুলির কয়েকটি সংস্করণে ব্যর্থ হবে। সমস্ত না, যদিও (এটি অপরিজ্ঞাত আচরণ) এবং এটি স্ট্রিং দৈর্ঘ্যের (এসএসও) উপর নির্ভর করে। দয়া করে .c_str ()
MSalters

প্লাস স্প্রিন্টফ সম্ভাব্য কোড ইনজেকশন বাফার উপচে পড়বে
জিন-ফ্রান্সোয়েস ফ্যাব্রে

15
#include <string>
#include <sstream>
using namespace std;
string concatenate(std::string const& name, int i)
{
    stringstream s;
    s << name << i;
    return s.str();
}

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

গুগলড [এবং পরীক্ষিত: পি]


10

এই সমস্যাটি বিভিন্ন উপায়ে করা যেতে পারে। আমি এটি দুটি উপায়ে দেখাব:

  1. স্ট্রিং ব্যবহার করে নম্বরটি রূপান্তর করুন to_string(i)

  2. স্ট্রিং স্ট্রিম ব্যবহার করে।

    কোড:

    #include <string>
    #include <sstream>
    #include <bits/stdc++.h>
    #include <iostream>
    using namespace std;
    
    int main() {
        string name = "John";
        int age = 21;
    
        string answer1 = "";
        // Method 1). string s1 = to_string(age).
    
        string s1=to_string(age); // Know the integer get converted into string
        // where as we know that concatenation can easily be done using '+' in C++
    
        answer1 = name + s1;
    
        cout << answer1 << endl;
    
        // Method 2). Using string streams
    
        ostringstream s2;
    
        s2 << age;
    
        string s3 = s2.str(); // The str() function will convert a number into a string
    
        string answer2 = "";  // For concatenation of strings.
    
        answer2 = name + s3;
    
        cout << answer2 << endl;
    
        return 0;
    }

কোনটি দ্রুত?
GyuHyeon Choi

7

আপনি যদি +আউটপুট অপারেটর রয়েছে এমন কোনও কিছুর সংযোগের জন্য ব্যবহার করতে চান তবে আপনি এর একটি টেমপ্লেট সংস্করণ সরবরাহ করতে পারেন operator+:

template <typename L, typename R> std::string operator+(L left, R right) {
  std::ostringstream os;
  os << left << right;
  return os.str();
}

তারপরে আপনি আপনার বক্তৃতা সোজা উপায়ে লিখতে পারেন:

std::string foo("the answer is ");
int i = 42;
std::string bar(foo + i);    
std::cout << bar << std::endl;

আউটপুট:

the answer is 42

এটি সর্বাধিক দক্ষ উপায় নয়, তবে আপনি কোনও লুপের ভিতরে প্রচুর পরিমাণে কনটেন্টেশন না করে আপনার সবচেয়ে কার্যকর উপায়ের প্রয়োজন হবে না।


আমি যদি পূর্ণসংখ্যা বা পূর্ণসংখ্যা এবং একটি ডাবল যুক্ত করার চেষ্টা করি, তবে এই ফাংশনটি বলা হবে? যদি এই সমাধান স্বাভাবিক সংযোজন ওভাররাইড করবে আমি অবাক হচ্ছি ...
Hilder Vitor থেকে লিমা পেরেইরা

অপারেটর একটি ফেরত দেয় std::string, সুতরাং কোনও স্ট্রিং প্রয়োজনীয় ধরণের রূপান্তরযোগ্য নয় এমন অভিব্যক্তিগুলিতে প্রার্থী হবে না। যেমন, এই operator+জন্য ব্যবহার করা হবে যোগ্য নয় +মধ্যে int x = 5 + 7;। সমস্ত বিষয় বিবেচনা করা হয়, আমি খুব জোরালো কারণ ছাড়াই এ জাতীয় অপারেটরটিকে সংজ্ঞায়িত করব না , তবে আমার লক্ষ্য ছিল অন্যের থেকে আলাদা উত্তর দেওয়া।
uckelman

আপনি ঠিক বলেছেন (আমি এটি পরীক্ষা করেছি ...)। এবং যখন আমি স্ট্রিং s = 5 + 7 এর মতো কিছু করার চেষ্টা করেছি, তখন আমি ত্রুটিটি অবৈধ রূপান্তরটি 'INT' থেকে 'কনস্ট চর ' * এ পেয়েছি
হিল্ডার ভিটার লিমা পেরেইরা


4

Std :: ostringstream একটি ভাল পদ্ধতি, তবে কখনও কখনও এই অতিরিক্ত কৌশলটি বিন্যাসকে এক-লাইনারে রূপান্তর করতে খুব সহজেই কাজে লাগে get

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

4

যেহেতু Qt- সম্পর্কিত প্রশ্নটি এইটির পক্ষে বন্ধ ছিল তাই Qt ব্যবহার করে এটি কীভাবে করা যায় তা এখানে:

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

স্ট্রিং ভেরিয়েবলের এখন% 1 এর জায়গায় কিছুটা ইনভেয়ারেবলের মান এবং শেষে কিছুটা অন্যটির পরিবর্তনের মান রয়েছে।


কিউ স্ট্রিং ("কিছু কিছুর") + কিউ স্ট্রিং :: সংখ্যা (কিছু কিছু পরিবর্তনশীল) এছাড়াও কাজ করে
গ্রিমওয়েল

3

স্ট্রিং সহ পূর্ণসংখ্যা (বা অন্যান্য সংখ্যার বস্তু) সংযুক্ত করার জন্য আরও বেশি বিকল্প ব্যবহার করা সম্ভব। এটি বুস্ট.ফর্ম্যাট

#include <boost/format.hpp>
#include <string>
int main()
{
    using boost::format;

    int age = 22;
    std::string str_age = str(format("age is %1%") % age);
}

এবং বুস্ট.স্পরিট থেকে কর্মফল (v2)

#include <boost/spirit/include/karma.hpp>
#include <iterator>
#include <string>
int main()
{
    using namespace boost::spirit;

    int age = 22;
    std::string str_age("age is ");
    std::back_insert_iterator<std::string> sink(str_age);
    karma::generate(sink, int_, age);

    return 0;
}

বুস্ট.স্পিরিট কর্মা পূর্ণসংখ্যার স্ট্রিং রূপান্তরকরণের জন্য দ্রুততম বিকল্পগুলির মধ্যে একটি বলে দাবি করে ।



3

আপনি নীচের নীচে সাধারণ কৌশল ব্যবহার করে স্ট্রিং টু স্ট্রিং করতে পারেন তবে নোট করুন যে এটি কেবল তখনই কাজ করে যখন পূর্ণসংখ্যা একক অঙ্কের হয়। অন্যথায়, স্ট্রিংয়ের সাথে অঙ্ক অনুযায়ী পূর্ণসংখ্যার সংখ্যা যুক্ত করুন।

string name = "John";
int age = 5;
char temp = 5 + '0';
name = name + temp;
cout << name << endl;

Output:  John5

2

এখানে আইওএসটিমস লাইব্রেরি থেকে পার্সিং এবং ফর্ম্যাটিং ফ্যাক্টগুলি ব্যবহার করে কোনও স্ট্রিংয়ের সাথে কীভাবে সংযুক্ত করা যায় তার একটি বাস্তবায়ন।

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

2
  • এসটিডি :: ostringstream
#include <sstream>

std::ostringstream s;
s << "John " << age;
std::string query(s.str());
  • স্ট্যান্ড :: টু স্ট্রিং (সি ++ 11)
std::string query("John " + std::to_string(age));
  • বুস্ট :: lexical_cast
#include <boost/lexical_cast.hpp>

std::string query("John " + boost::lexical_cast<std::string>(age));

কোনটি দ্রুততম?
GyuHyeon Choi

2

আমি লিখেছি একটি ফাংশন আছে, যা প্যারামিটার হিসাবে 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 holds 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 combination 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;
}

1

সঙ্গে {FMT} গ্রন্থাগার :

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

লাইব্রেরির একটি উপসেট P0645 পাঠ্য বিন্যাস হিসাবে মানিকরণের জন্য প্রস্তাবিত এবং যদি গ্রহণ করা হয় তবে উপরেরটি হয়ে যাবে:

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

দাবি অস্বীকার: আমি {fmt} লাইব্রেরির লেখক।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.