সি ++ এ স্ট্রিং-এ রূপান্তর করার সহজ উপায়


1573

কি সহজ পদ্ধিতি হল উপায় থেকে রূপান্তর হয় intসমতুল্য করার stringC ++। আমি দুটি পদ্ধতি সম্পর্কে সচেতন। কোন সহজ উপায় আছে?

(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
আমি মনে করি আপনার দেওয়া দুটি পদ্ধতিই ভাল সমাধান। এটি নির্ভর করে যেখানে আপনাকে এটি করা দরকার on যদি আপনি ইতিমধ্যে স্ট্রিমের সাথে কাজ করছেন, উদাহরণস্বরূপ কোনও ফাইল পড়া বা লেখা, তবে আপনার দ্বিতীয় পদ্ধতিটি সেরা। যদি আপনাকে কোনও ফাংশন আর্গুমেন্টের স্ট্রিং হিসাবে কোনও int পাস করতে হয়, তবে এটিোয়া একটি সহজ উপায় হতে পারে। তবে বেশিরভাগ সময় ফাইলের সাথে কাজ করার সময় ইন টু স্ট্রিং রূপান্তর ঘটে থাকে, সুতরাং স্ট্রিমগুলি উপযুক্ত।
চার্লস ব্রুনেট

41
বিকল্প 1 এমনকি আপনার পক্ষে কীভাবে কাজ করে? এটি আমার বোঝার itoa()জন্য তিনটি পরামিতি লাগে।
b1nary.atr0phy

1
আইটোয়া স্ট্রিমের সমতুল্যের চেয়ে দ্রুত হবে। এটিও পদ্ধতিতে স্ট্রিং বাফারটিকে পুনরায় ব্যবহার করার উপায় রয়েছে (যদি আপনি ঘন ঘন স্ট্রিং উত্পাদন করে থাকেন তবে গাদা বরাদ্দকে এড়িয়ে চলুন eg যেমন কিছু দ্রুত সংখ্যার আউটপুট আপডেট করার জন্য)। বিকল্পভাবে কিছু বরাদ্দ ওভারহেড হ্রাস করার জন্য আপনি একটি কাস্টম স্ট্র্যামবুফ তৈরি করতে পারেন etc. প্রথম স্থানে স্ট্রিম তৈরি করাও কম খরচের উদ্যোগ নয়।
পিট

6
@Pete: একবার আপনার সম্পর্কে যা দ্রুততর, আপনি তাকান করতে চাইবেন উদ্বেজক শুরু stackoverflow.com/questions/4351371/...
বেন Voigt

20
নোট করুন যে ইটোয়া () স্ট্যান্ডার্ডের অংশ নয় এবং সুতরাং এটি ব্যবহার করা আপনার কোডটিকে পোর্টেবল হিসাবে রেন্ডার করে না কারণ সমস্ত সংকলক এটি সমর্থন করে না। লিনাক্সের জন্য আপনি অবশ্যই জিসিসি ব্যতীত অন্য কোনও কিছু ব্যবহার না করে থাকেন, যা এই ফাংশনটিকে সমর্থন করে না। আপনার যদি সি ++ 0x থাকে তবে @ ম্যাথিউ তার উত্তরে যা বলেছে তা দিয়ে যান। যদি এটি না হয় তবে স্ট্রিংস্ট্রিমের সাথে যান কারণ এটি একটি ভাল সমর্থিত বৈশিষ্ট্য এবং আপনার কোডটি প্রতিটি সি ++ কম্পাইলারের সাথে সামঞ্জস্য করা উচিত। বিকল্প হিসাবে আপনি সর্বদা স্প্রিন্টফ () এর সাথে যেতে পারেন।
rbaleksandar

উত্তর:


2097

সি ++ 11 উপস্থাপন করে std::stoi(এবং প্রতিটি সংখ্যার টাইপের জন্য রূপগুলি) এবং std::to_string, সি এর সমমনা atoiএবং itoaতবে এর মেয়াদে প্রকাশিত হয় std::string

#include <string> 

std::string s = std::to_string(42);

তাই আমি ভাবতে পারি সবচেয়ে সংক্ষিপ্ততম উপায়। আপনি autoকীওয়ার্ডটি ব্যবহার করে প্রকারের নামকরণও বাদ দিতে পারেন :

auto s = std::to_string(42);

নোট: দেখুন [string.conversions] ( 21.5 মধ্যে n3242 )



36
বা আপনার g++ -std=c++11 someFile.cc
সংকলকটির

12
@ স্টিভ: এটি হওয়ার কথা। stdআমার পরিচিত প্রতিটি সংকলকের এটির একজন ছাড়া আমি জানি।
মাকিং হাঁস

5
@ ম্যাথিউ এম। আমি আপনার প্রস্তাবিত একই ব্যবহার করছি তবে আমি এই ত্রুটিটি Error : No instance of overloaded function "std::to_string" matches the argument list পাচ্ছি : আমি ভিএস 2010 সি ++ ব্যবহার করছি

19
@ ফ্লাইং: ভিএস ২০১০ এর অধীনে আপনাকে নিম্নলিখিত ধরণের একটিতে স্পষ্টভাবে রূপান্তরকারী পূর্ণসংখ্যা কাস্ট করতে হবে [_ লংলং, _লংলং, দীর্ঘ ডাবল]; যেমন:string s = to_string((_ULonglong)i);
জ্যাক

183

কয়েক বছর পরে @ v.oddou এর সাথে আলোচনা শুরু করে, সি ++ 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 ) );

আসল উত্তর:

যেহেতু "স্ট্রিংয়ে রূপান্তর করা ..." বার বার সমস্যা, তাই আমি সর্বদা আমার সি ++ উত্সের কেন্দ্রীয় হেডারে এসআরটি () ম্যাক্রো সংজ্ঞায়িত করি :

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

উপরেরটি সি ++ 98 সামঞ্জস্যপূর্ণ (যদি আপনি সি ++ 11 ব্যবহার করতে না পারেন std::to_string), এবং কোনও তৃতীয় পক্ষের প্রয়োজন নেই (যদি আপনি বুস্ট ব্যবহার করতে না পারেন lexical_cast<>); এই উভয় সমাধানের একটি আরও ভাল পারফরম্যান্স রয়েছে।


2
আমি এর সাথে খুব বেশি পরিচিত dynamic_castনই তবে আমি সংকলন করতে ঝাঁকুনি ব্যবহার করছি যাতে এটি এটি সম্পর্কে অভিযোগ করে। আমি যদি কেবলমাত্র বাদ দিই dynamic_castতবে এটি সূক্ষ্ম সংকলন করে; dynamic_castএই ক্ষেত্রে কোন উদ্দেশ্যটি পরিবেশন করে ? আমরা ইতিমধ্যে একটি তৈরি করছি ostringstream, তাই কেন এটি castালাই?
ম্যাথিউ

2
@ ম্যাথিউ: আমার উত্তরের লিঙ্কটি নির্মাণের প্রতিটি অংশের বিশদ বিবরণ বাড়ে। আমরা একটি তৈরি করার সময় ostringstream, আমরা operator<<()এটিতে ডেকেছিলাম , যা প্রত্যাবর্তন করে ostream &- যার .str()জন্য সংজ্ঞা দেওয়া হয়নি। আমি সত্যিই আশ্চর্য হই যে কীভাবে ঝাঁকুনি নাটক ছাড়াই এই কাজটি করবে (বা কেন এটি এর সাথে ত্রুটি তৈরি করে)। এই কনস্ট্রাক্টটি অনেক জায়গায় প্রকাশিত হয়েছে, এবং আমি এমএসভিসি, জিসিসি, এবং এক্সএলসি সহ বিভিন্ন বিভিন্ন সংকলকগুলিতে এক দশকেরও বেশি সময় ধরে এটি ব্যবহার করেছি, তাই আমি এতে বিড়বিড় হয়ে বলছি না am
দেবসোলার

5
সবেমাত্র কৌতূহলের জন্য পার্টিতে এসেছিলেন, এবং ডাউনওয়েটেড। কারণ: অ-মার্জিত এবং সম্ভবত ধীর গতির একটি সমাধানের জন্য খুব বেশি ভোট। 1. ম্যাক্রো ব্যবহার। আমি কোনও ম্যাক্রোকে নিয়মতান্ত্রিকভাবে ভ্রূণ করি না, তবে এটি একটি খুব সংক্ষিপ্ত এবং শেষ ক্লায়েন্টরা সর্বদা অরক্ষিত মাল্টিলিন ম্যাক্রোগুলির জন্য ভয়ের শীর্ষে যুক্তির পুনরাবৃত্তি ভয় পায়। ((0) করার সময় (0) দ্বারা সুরক্ষিত নয়) 2. ডায়নামিক_কাস্ট। মনে হচ্ছে আপনার এখানে কেবলমাত্র একটি স্ট্যাটিক_কাস্ট দরকার, আপনি যদি আশা করেন যে লাইব্রেরিটি বাস্তবে বাস্তবায়িত হয়েছে তবে আপনি নিশ্চিত করতে চান না। এক্ষেত্রে আপনার পরিবর্তে বুথ :: পলিমারফিক_ডাউনকাস্ট ব্যবহার করা উচিত।
v.oddou

2
@ ভি.ডডু: আপনি অবশ্যই সমালোচনা মুক্ত। তবে ১ টি অবৈধ - ম্যাক্রো একটি একক বিবৃতি, do { } while( 0 )কিছু যুক্ত করবে না। ২ এবং ৩ দিয়ে আপনি সম্ভবত একটি পয়েন্ট পেয়েছেন - এটি একটি স্ট্যাটিক কাস্টের সাহায্যে করা যেতে পারে এবং সম্ভবত আপনার কোনও টেমপ্লেট উইজার্ড একটি "ভাল" ইন্টারফেস নিয়ে আসতে পারে। তবে আমি যেমন বলেছি, এটি কোনওভাবেই আমার নিজের আবিষ্কার নয়। চারপাশে দেখুন, এই ম্যাক্রো (ম্যাক্রো) বেশ সর্বব্যাপী। এটি নিজের মধ্যে পোলার একটি ঘটনা। এটিকে আরও "প্রবাহিত" করতে আমি কিছুটা খেলনা খেলতে পারি।
দেবসোলার

1
@ ভি.ডডু: সি ++ 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()ত্রুটি / ইওফ পতাকাগুলি পুনরায় সেট করে এবং এখনও কোনও ত্রুটি / ইওফ শর্ত তৈরি হয়নি।
রেমি Lebeau

2
@Rasoul NumberToString(23213.123)উত্পাদন করে 23213.1যখন std::to_string(23213.123)উৎপন্ন 23213.123000সেখানে কি হবে?
Killzone কিড

1
@ কিলজোনকিড এটি কারণ কারণ স্টাডির 'অস্ট্রিমেট স্টেটফুল (এর অর্থ এই যে কোনও পূর্বের রাষ্ট্রীয় পরিবর্তন যেমন দশমিক অঙ্কের সংখ্যার মতো রাখা হয়) যখন এই পদ্ধতিটি একটি ডিফল্ট রাষ্ট্র দিয়ে শুরু হয়।
xryl669

85

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

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

এর এক নব্বইটি এটি অন্যান্য ক্যাসটকেও সমর্থন করে (যেমন, বিপরীত দিকটি ঠিক তেমনভাবেও কাজ করে)।

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

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

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

সঙ্গে রূপান্তর করছেন সমতূল্য হিসেবে মান সংজ্ঞায়িত এই sprintf(রূপান্তর specifier যে যেমন বস্তুর সরবরাহকৃত ধরন, ম্যাচ ব্যবহার %dজন্য int), যথেষ্ট আকারের একটি বাফার মধ্যে, তারপর তৈরি std::stringযে বাফার বিষয়বস্তুর।


2
ভাল, আমি কেভিনের উত্তর পছন্দ করি, যদিও তিনি অন্তর্ভুক্ত এবং নামের স্থানটি দেখান। কেবল একটি ছোটখাটো গ্রিপ। :) ভাল কাজ, যদিও!
জেসন আর। মিক

4
আমি যদি বলি যে আপনি যদি সি ++ 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

খাঁটি সি ++ তে আমি জানি না। তবে আপনি যা উল্লেখ করেছেন তাতে কিছুটা পরিবর্তন ification

string s = string(itoa(a));

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


55
itoa()কোনও স্ট্যান্ডার্ড ফাংশন নয়!
15:25

4
@ কার্টুনিস্ট: তাহলে এটা কী?
ব্যবহারকারী541686

20
এই ফাংশনটি এএনএসআই-সি এবং সি ++ এ সংজ্ঞায়িত করা হয়নি। সুতরাং এটি g ++ এর মতো কিছু সংকলক দ্বারা সমর্থিত নয়।
কার্টুনিস্ট

17

ম্যাথিউ এম দ্বারা প্রস্তাবিতstd::to_string হিসাবে আপনি সি ++ 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 গুণ বেশি গতিযুক্ত। C ++ এ স্ট্রিং রূপান্তরটিতে দ্রুত পূর্ণসংখ্যা দেখুন আরো বিস্তারিত জানার জন্য।

লক্ষ্য করুন যে উভয়ই থ্রেড-নিরাপদ।

অপছন্দ std::to_string,fmt::format_int C ++ 11 প্রয়োজন হয় না এবং কোনও সি ++ সংকলক সহ কাজ করে।

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


2
থ্রেডসেফ (পুনরায় প্রবেশকারী) থাকা অবস্থায় কোনও গতিশীল মেমরি বরাদ্দ না থাকার দাবি সম্পর্কে আমি কৌতূহল ছিলাম, তাই আমি আপনার কোডটি পড়ি - ক্লাসের c_str()মধ্যে ঘোষিত একটি বাফারকে পয়েন্টার প্রদান করে fmt::FormatInt- সুতরাং পয়েন্টারটি অবৈধ হবে সেমিকোলন - স্ট্যাকওভারফ্লোও
সোরেন

1
হ্যাঁ, std::string::c_str()( যেমন নামকরণ) এর সাথে একই আচরণ । আপনি যদি এটি সম্পূর্ণ প্রকাশের বাইরে ব্যবহার করতে চান তবে কোনও বস্তু তৈরি করুন তবে FormatInt f(42);আপনি f.c_str()এটি বিনষ্ট হওয়ার আশঙ্কা ছাড়াই ব্যবহার করতে পারেন ।
ভিটাউট

1
আমি যখন std :: to_string (num) ব্যবহার করে int থেকে স্ট্রিংয়ে রূপান্তর করার চেষ্টা করি তখন আমি কিছু অদ্ভুত কিছু পাই। যদি আমি ফলাফলটি একটি চলকতে সঞ্চয় করি এবং স্ট্রিংনাম [1] বা স্ট্রিংনাম [n] এর মতো এন বাড়ার চেষ্টা করি তবে আমি আবর্জনা পাই।
ব্যবহারকারী 8951490

1
এটি অবশ্যই এই প্রশ্নের সঠিক উত্তর: কার্যকর এবং স্ট্যান্ডার্ড কোড যা রাষ্ট্রীয় নয়।
xryl669

16

sprintf()ফর্ম্যাট রূপান্তর জন্য বেশ ভাল। এরপরে আপনি 1 এর মতো সি ++ স্ট্রিংকে ফলাফল সি স্ট্রিং বরাদ্দ করতে পারেন।


1
হ্যাঁ, হ্যাঁ যাইহোক, আমি সাধারণত সি স্ট্রিংগুলি পরিচালনা করার সময় ফলাফলের জন্য স্নিপ্রিন্টফ () এবং বন্ধুদের উপর নির্ভর করি।
Throwback1986

1
@MatthieuM। আপনার মন্তব্যটি আরও প্রমাণ করে যে আপনি নন। যদি এই সীমাবদ্ধতার কারণে যদি আউটপুট কেটে ফেলা হয় তবে প্রত্যাবর্তনের মান হ'ল অক্ষরের সংখ্যা (সমাপ্ত নাল বাইট বাদে) যা পর্যাপ্ত জায়গা উপলব্ধ থাকলে চূড়ান্ত স্ট্রিংয়ে লেখা হত। সুতরাং আকার বা তারও বেশি ফেরতের মান মানে আউটপুট কেটে গেছে। সুতরাং আপনি এটি NULLপ্রয়োজনীয় বাফার আকার পেতে একটি এবং শূন্য আকার দিয়ে কল করুন ।
ব্যবহারকারী 1095108

2
@ ব্যবহারকারী 1095108: আমি মনে করি আপনি ভুল করছেন snprintf( এসএনপি উপসর্গটি নোট করুন ) এবং sprintf( এসপি উপসর্গটি নোট করুন )। আপনি পূর্বেরটির কাছে আকারটি প্রেরণ করলেন এবং এটি উপচে না যাওয়ার যত্ন নেওয়া হবে, তবে পরবর্তীকালে বাফারের আকার জানেন না এবং এভাবে উপচে পড়তে পারে।
ম্যাথিউ এম।

1
ধারণাটি হ'ল snprintfপ্রথমে একটি sprintfবৈকল্পিক এবং তার পরে একটি বৈকল্পিক কল করা । ততক্ষণে বাফার আকারটি জানা sprintfগেলে , কল করা পুরোপুরি নিরাপদ হয়ে যায়।
ব্যবহারকারী 1095108

1
@ ব্যবহারকারী 1095108 আহ, হ্যাঁ। স্নপ্রিন্টফের প্রথম বাফার যদি অপর্যাপ্ত হয় তবে রিটার্ন মানটি আপনাকে যথেষ্ট পরিমাণে বলবে। আমি এখনও দ্বিতীয় কলটির জন্য স্নিপ্রিন্টফ ব্যবহার করব, কারণ স্প্রিন্টফ এবং সানপ্রিন্টফের সাথে ম্যাচ প্রয়োগের উপর নির্ভর করা অযৌক্তিকভাবে বিপজ্জনক।
mabraham

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/references/ostream/ostream/operator%3C%3C/ দেখুন যেখানে এটি operator<<ফর্ম্যাট আউটপুট সন্নিবেশ করিয়ে দেয়।

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

যেমন, int = 1000একটি স্ট্রিতে রূপান্তরিত হতে পারে 1.001। এটি তুলনা অপারেশনগুলি মোটেই কার্যকর না করে তুলতে পারে।

সুতরাং আমি দৃ strongly়ভাবে উপায়টি ব্যবহার করার পরামর্শ দেব std::to_string। এটি সহজ এবং আপনি যা প্রত্যাশা করেন তা করে।

আপডেট হয়েছে (নীচে মন্তব্য দেখুন) :

সি ++ 17 std::to_charsএকটি উচ্চ-কর্মক্ষমতা লোকেল-স্বতন্ত্র বিকল্প হিসাবে সরবরাহ করে


2
আমি একমত যে আপনার যদি ডেটা আদান-প্রদানের প্রয়োজন হয় তবে এটি একটি গুরুতর সমস্যা। দুর্ভাগ্যক্রমে, std::to_stringবর্তমান লোকেলও ব্যবহার করুন (দেখুন en.cppreferences.com/w/cpp/string/basic_string/to_string , 'নোটস' বিভাগ)। প্রায় সমস্ত স্ট্যান্ডার্ড সরঞ্জাম (স্ট্রিং স্ট্রিম থেকে sprintfতবে এগুলিও sscanf) বর্তমান লোকেল ব্যবহার করছে। আমি যখন এ সম্পর্কে আমাকে কঠোরভাবে আঘাত করলাম তখন পর্যন্ত আমি এ সম্পর্কে অবগত ছিলাম না। বর্তমানে ঘরে তৈরি স্টাফ ব্যবহার করছেন, তৈরি করা শক্ত নয়।
বার্ট ব্রিল

উপরের লিঙ্কে এটিও বর্ণিত যে সি ++ 17 উচ্চতর পারফরম্যান্স স্থানীয়-স্বতন্ত্র বিকল্প হিসাবে স্টাড :: টু_চার্স সরবরাহ করে।
YesThatIsMyName

দুর্ভাগ্যক্রমে, আমি আসন্ন বছর (গুলি) এর জন্য সি ++ 11 এর সাথে আটকে আছি (ভাগ্যক্রমে ইতিমধ্যে বেশ উন্নতি)।
বার্ট ব্রিল

1
from_chars এবং to_chars নিখুঁত হবে তবে দুর্ভাগ্যক্রমে তারা একটি wchar_t বৈকল্পিক প্রস্তাব দেয় নি।
gast128

8

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

boost/lexical_cast

বুস্টটি সি ++ লাইব্রেরির অংশ নয় তবে এতে অনেকগুলি দরকারী লাইব্রেরি এক্সটেনশন রয়েছে।

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

এই ফাংশনটি এএনএসআই-সি-তে সংজ্ঞায়িত নয় এবং এটি সি ++ এর অংশ নয়, তবে কয়েকটি সংকলক দ্বারা সমর্থিত।
- সিপিপ্লসপ্লাস.কম

এর অর্থ হ'ল 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 একটি সি স্ট্যান্ডার্ড লাইব্রেরি ফাংশন যা সি স্ট্রিংয়ে কাজ করে এবং এটি একটি সম্পূর্ণ বৈধ বিকল্প।

একই পাঠ্য সহ একটি স্ট্রিং রচনা করে যা মুদ্রণযোগ্য মুদ্রণ হবে যদি প্রিন্টফ এ ব্যবহৃত হয় তবে মুদ্রণের পরিবর্তে সামগ্রীটি স্ট্র দ্বারা নির্দেশিত বাফারে একটি সি স্ট্রিং হিসাবে সংরক্ষণ করা হয়।
- সিপিপ্লসপ্লাস.কম

#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

এটি সি ++ লাইব্রেরির মূল সংকেতগুলিকে স্ট্রিংগুলিতে রূপান্তর করার এবং এর বিপরীতে way 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 মাইক্রোসেকেন্ডের লাগে, এবং তারপর যথেষ্ট পরে যদি redundantly সম্পন্ন দ্রুত সম্পন্ন করা, কিন্তু পূর্ববর্তী ফাংশন যতটা না


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


আমাদের দেখাশোনা করার জন্য ধন্যবাদ (সি ++ 98 ব্যবহারকারী)
এ বি

@AB- কে এখনও আমি C ++ 98 ব্যবহারকারীর বাকী থাকতে পারছি না।
কোটাউস্কাস

@ ভ্লাদিস্লাভ টনচরভ যখন আপনার কাজটি কেবলমাত্র উত্তরাধিকার সরঞ্জাম এবং কোড সমর্থন করার জন্য হয় তখন আপনি সতেজ শিল্পের মানগুলি ব্যবহার করে পুরানো জিনিসগুলিতে ব্যঙ্গ করেন। একটি গ্রীষ্ম আগে, আমি পাইথন ২.৩ এ কোড লিখছিলাম।
জোশুয়া ডিটওয়েলার

@ জোশুয়া ডেটাওয়েলার ওহ, সে সম্পর্কে ভুলে গেছি, দুঃখিত।
কোটাউস্কাস


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' বাম-padded , এই অল্প endian আর্কিটেকচারের (সমস্ত এক্স 86,, 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
বাই-অর্ডার সম্পর্কে কী?
shjeff

পয়েন্টার আলিয়াসিংয়ের কারণে কি এই অপরিবর্তিত আচরণ নয়?
dgnuff

1
@ শ্যাজেফ মন্তব্যের জন্য ধন্যবাদ, আমি উত্তরে অন্তর্নিহিততার বিষয়ে একটি নোট যুক্ত করেছি।
আলেক

@ ডিগনফ এটিকে নির্দেশ করার জন্য ধন্যবাদ, যদিও এতে আমার কোনও সমস্যা ছিল না, আপনি ঠিক বলেছেন। আমি উত্তরটি কিছুটা সংশোধন করেছিলাম যাতে এটি কঠোর আলিয়াজিং বিধি মেনে চলে, ধন্যবাদ।
আলেক

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

এটি আমার উইন্ডোজ এবং লিনাক্স জি ++ সংকলকগুলিতে কাজ করে।


0

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

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

sprintf প্রয়োজনীয় বিন্যাসের স্ট্রিংয়ে কোনও ডেটা .োকানোর জন্য এটি একটি সুপরিচিত is

char *তৃতীয় লাইনে প্রদর্শিত হিসাবে আপনি একটি স্ট্রিতে একটি অ্যারে রূপান্তর করতে পারেন ।


0

এটি আমার পক্ষে কাজ করেছে -

আমার কোড:

#include <iostream>
using namespace std;

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

মূলত কি ব্যবহার করছেন? stringstream?
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন সাবধানতার সাথে দেখুন, এটিstd::to_string()
কোটাউস্কাস

আমার আছে using namespace std;:)
গোনালো গ্যারিডো

0

সি ++ 11 std::to_string()সংখ্যার প্রকারের জন্য প্রবর্তিত :

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

4
ওহে! আপনি কেন এবং কীভাবে এই প্রশ্নের উত্তর সরবরাহ করে সে সম্পর্কে আপনি একটি ব্যাখ্যা যুক্ত করতে পারেন?
14

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 for0 এর জন্য ব্যর্থ হয়
টবি

-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

আপনি যদি এমএফসি ব্যবহার করছেন তবে আপনি এটি ব্যবহার করতে পারেন CString:

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

8
আপনার অবশ্যই লক্ষ্য করা উচিত যে এটি কেবলমাত্র মাইক্রোসফ্ট-এক্সটেনশন: এমএসডিএন.মাইক্রোসফট.ইন.উস
লিবারিয়ান

1
আমি CString :: ফর্ম্যাট () এর ধারণাটি পছন্দ করি। দুর্ভাগ্যজনকভাবে এটি কেবল নন পোর্টেবল এমএস।
নিক

1
আপনার মন্তব্য @ জনি জেডি থেকে তথ্য অন্তর্ভুক্ত করার জন্য আমি আমার উত্তর আপডেট করেছি, যেহেতু আমি এর জন্য 5 বছর পরে
অবনমিত হতে থাকি

-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 এর শক্তির দ্বারা ওজনিত করে তোলেন So সুতরাং অনুমান করুন যে পূর্ণসংখ্যা 950 হয়।

    • যদি পূর্ণসংখ্যা সমান বা 100,000 এর বেশি হয় তবে 100,000 বিয়োগ করুন এবং স্ট্রিংয়ের মধ্যে "" 000000 "] এ কাউন্টার বাড়ান;
      100,000 পজিশনে আর সংখ্যা না পাওয়া পর্যন্ত এটি চালিয়ে যান। দশের আর একটি শক্তি ফেলে দিন।

    • যদি পূর্ণসংখ্যা সমান বা 10,000 এর বেশি হয় তবে 10,000 বিয়োগ করুন এবং স্ট্রিংয়ের মধ্যে কাউন্টারকে ["000000"] + 1 পজিশনে বাড়ান;
      10,000 পদে আর সংখ্যা না পাওয়া পর্যন্ত এটি চালিয়ে যান।

  • দশের আর একটি শক্তি ফেলে দিন

  • প্যাটার্নটি পুনরাবৃত্তি করুন

আমি জানি 950 উদাহরণ হিসাবে ব্যবহার করার জন্য খুব ছোট, তবে আমি আশা করি আপনি ধারণাটি পাবেন।


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