c++ - উনল - সি++ বই




সি++ এ স্ট্রিং int int রূপান্তর করার সবচেয়ে সহজ উপায় (17)

এখানে আরেকটি সহজ উপায়

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

sprintf প্রয়োজনীয় বিন্যাস একটি স্ট্রিং মধ্যে কোনো তথ্য সন্নিবেশ করা একটি সুপরিচিত এক।

আপনি গৃহস্থালি * অ্যারেটি তৃতীয় সারিতে দেখানো স্ট্রিং রূপান্তর করতে পারেন।

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

আপনি Matthieu M দ্বারা প্রস্তাবিত 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();

পরেরটি কোন গতিশীল মেমরি বরাদ্দ করে না এবং Boost Karma বেঞ্চমার্কগুলিতে std::to_string চেয়ে 10 গুণ বেশি দ্রুত। আরো বিস্তারিত জানার জন্য সি ++ রূপান্তর স্ট্রিং দ্রুত পূর্ণসংখ্যা দেখুন।

fmt::FormatInt বিপরীতে, fmt::FormatInt জন্য C ++ 11 প্রয়োজন নেই এবং কোন C ++ কম্পাইলারের সাথে কাজ করে।

Disclaimer: আমি সি ++ ফরম্যাট লাইব্রেরীর লেখক।


আপনি বুস্ট ইনস্টল আছে (যা আপনি উচিত):

#include <boost/lexical_cast.hpp>

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

আমি জানি না, বিশুদ্ধ সি ++। কিন্তু আপনি উল্লেখ কি একটু সংশোধন

string s = string(itoa(a));

কাজ করা উচিত, এবং এটা বেশ সংক্ষিপ্ত।


আমি মনে করি, স্ট্রিংস্ট্রিম ব্যবহার করে বেশ সহজ।

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

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

আমি সাধারণত নিম্নলিখিত পদ্ধতি ব্যবহার করে:

#include <sstream>

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

here বিস্তারিত বর্ণনা।


কিছু সিনট্যাক্টিক চিনি যোগ করা আরও সহজ, যা একটি স্ট্রিমের মতো ভাবে ফ্লাইতে স্ট্রিং রচনা করতে দেয়

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

যদি আপনি সংখ্যার সংখ্যার সংখ্যার সাথে একটি পূর্ণসংখ্যা দ্রুত রূপান্তর করতে চান তবে * 0 'দিয়ে বাম-প্যাডেড, এটি একটি সুবিধাজনক উদাহরণ:

int n = 27;
char s[8];

আপনি যদি দুই-সংখ্যার নম্বর রূপান্তর করেন:

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

এবং তাই সাত সংখ্যার সংখ্যা পর্যন্ত :)


সম্ভবত সবচেয়ে সাধারণ সহজ উপায় আপনার দ্বিতীয় পছন্দটি lexical_cast নামে একটি টেমপ্লেটে নামকরণ lexical_cast , যেমন lexical_cast একটি, তাই আপনার কোডটি এইরকম দেখাচ্ছে:

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

এর একটি নিকৃষ্টতা এটি অন্য কাস্টগুলিকেও সমর্থন করে (যেমন বিপরীত দিকটি ঠিক পাশাপাশি কাজ করে)।

এছাড়াও মনে রাখবেন যে Boost lexical_cast শুধুমাত্র স্ট্রিংস্ট্রীমের কাছে লেখার মতো শুরু হয়েছিল, তারপর স্ট্রিম থেকে বেরিয়ে আসার পরে এটি এখন কয়েকটি সংযোজন রয়েছে। প্রথমত, বেশ কয়েকটি প্রকারের জন্য বিশেষত্ব যুক্ত করা হয়েছে, তাই অনেক সাধারণ ধরনের জন্য এটি স্ট্রিংস্ট্রিম ব্যবহার করার চেয়ে যথেষ্ট দ্রুত। দ্বিতীয়ত, এটি এখন ফলাফলটি পরীক্ষা করে, তাই (উদাহরণস্বরূপ) যদি আপনি কোন স্ট্রিং থেকে int তে রূপান্তর করেন তবে স্ট্রিংটি এমন কিছু থাকে যা কোনও int তে রূপান্তর করা যায় না (উদাহরণস্বরূপ, 1234 সফল হবে তবে 123abc নিক্ষেপ করা হবে)।

C ++ 11 হিসাবে, std::to_string ফাংশনটি পূর্ণসংখ্যার প্রকারের জন্য ওভারলোড করা আছে, তাই আপনি কোডটি ব্যবহার করতে পারেন:

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

স্ট্যান্ডার্ডটি sprintf সাথে রূপান্তর করার সমতুল্য হিসাবে নির্ধারণ করে (রূপান্তর স্পেসিফায়ার ব্যবহার করে যা সরবরাহকৃত বস্তুর সাথে মেলে, যেমন int for %d ), পর্যাপ্ত আকারের বাফারে, তারপর std::string তৈরি করে যে বাফার বিষয়বস্তু।


স্ট্রিংস্ট্রিম ব্যবহার করে এটি সহজ হবে না?

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

CString ব্যবহার করে:

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

সি ++ 98 এর জন্য কয়েকটি বিকল্প রয়েছে:

boost/lexical_cast

Boost 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 ব্যবহার করে কোড কম্পাইল করতে পারে না 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 একটি সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন যা সি স্ট্রিংগুলিতে কাজ করে এবং এটি পুরোপুরি বৈধ বিকল্প।

ফরম্যাটটি printf এ ব্যবহৃত হয় এমন একই পাঠ্য সহ একটি স্ট্রিং তৈরি করে তবে মুদ্রিত হওয়ার পরিবর্তে, সামগ্রীটি str দ্বারা চিহ্নিত বাফারে একটি 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

এটি সি ++ লাইব্রেরি এর স্ট্রিংয়ের পূর্ণসংখ্যা রূপান্তরের প্রধান উপায় এবং এর বিপরীত। stringstream মতো একই বোন ফাংশনগুলি রয়েছে যা stringstream আরও সীমিত করে, যেমন ostringstreamostringstream ব্যবহার করে বিশেষ করে আপনার কোডের পাঠককে বলে যে আপনি শুধুমাত্র << অপারেটর ব্যবহার করতে চান। এই ফাংশন একটি স্ট্রিং একটি পূর্ণসংখ্যা রূপান্তর করতে বিশেষ করে প্রয়োজনীয় যে সব। আরো বিস্তারিত আলোচনা জন্য এই প্রশ্ন দেখুন।

#include <sstream>
#include <string>

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

রানটাইম হিসাবে, ostringstream অপারেশনটি প্রায় 71 মাইক্রোসেকেন্ডে (আমার মেশিনে) লাগে, এবং তারপরে পরে অদলবদল করে তবে পরে আগের ফাংশনগুলি যতটা বাড়িয়ে দেয়

অবশ্যই অন্যান্য বিকল্প রয়েছে এবং আপনি নিজের ফাংশনে এটির একটিও মোড়ানো করতে পারেন তবে এটি জনপ্রিয় কিছুগুলির বিশ্লেষণাত্মক চেহারাকে উপলব্ধ করে।


সংখ্যা রূপান্তর জন্য স্ট্রিংস্ট্রিম ব্যবহার করে বিপজ্জনক!

দেখুন http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ যেখানে এটি operator<< বলে operator<< সন্নিবেশিত আউটপুট।

আপনার বর্তমান লোকেলের উপর ভিত্তি করে 3 সংখ্যার চেয়ে পূর্ণ একটি পূর্ণসংখ্যা, একটি অতিরিক্ত হাজার বিভাজক যোগ করে, 4 সংখ্যার একটি স্ট্রিং রূপান্তর করতে পারে।

যেমন, int = 1000 একটি স্ট্রিং 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);

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)


int n = 123;
std::string str = std::to_string(n);




type-conversion