কোনও int কে std :: স্ট্রিংয়ে রূপান্তর করা হচ্ছে


143

কোন ইনটকে একটি স্ট্রিংয়ে রূপান্তর করতে সবচেয়ে কম উপায়, পছন্দসই ইনলাইন-সক্ষম? Stl এবং boost ব্যবহার করে উত্তরগুলি স্বাগত জানানো হবে।



63
C ++ 11 আপনি ব্যবহার করতে পারেন to_stringমতstd::string s = std::to_string(42)

5
দীর্ঘ লাইভ সি ++ 11 এবং টু স্ট্রিং! :)
আগস্টিন

উত্তর:


350

আপনি সি ++ 11 তে স্ট্যান্ড :: টু স্ট্রিং ব্যবহার করতে পারেন

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

4
std :: to_string () MinGW এ কাজ করে না, যদি কেউ যত্ন করে থাকে।
আর্চি

3
@bparker ঠিক আছে, এটি gcc 4.8.0 এ ঠিক করা হয়েছে বলে আমার ধারণা I সর্বশেষ কোড সহ ব্লগিংয়ে আসা মিনিজিডব্লু :: ব্লকগুলি (13.12) এখনও জিসিসি 4.7.1 রয়েছে।
আর্চি 16

47
#include <sstream>
#include <string>
const int i = 3;
std::ostringstream s;
s << i;
const std::string i_as_string(s.str());

36

boost::lexical_cast<std::string>(yourint) থেকে boost/lexical_cast.hpp

স্ট্যান্ডার্ড :: অস্ট্রিমে সমর্থন সহ সমস্ত কিছুর জন্য কাজ, তবে তত দ্রুত নয়, উদাহরণস্বরূপ, itoa

এমনকি এটি স্ট্রিংস্ট্রিম বা স্ক্যানফের চেয়েও দ্রুত বলে মনে হচ্ছে:


15
বুস্ট আপনার বন্ধু, যদি স্ট্যান্ডার্ড সি ++ তে এটি করার কোনও সহজ উপায় না ছিল ... আমি অবশ্যই যা পছন্দ করি তা পছন্দ lexical_castকরি তবে মনে হয় বুস্ট এই ধরণের কাজের জন্য বেশ
প্রশমিত

2
Overkill? কিসের ভিত্তিতে? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
ক্যাটসকুল

আপনার শ্রোতাদের যদি তারা বুস্ট
ড্যামিয়ান

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>
টেকনাইকুইস্ট

@ টেকনাইকুইস্ট: ঠিক বলেছেন। সংকলনযোগ্য নয়, পরিবর্তিত হয়েছে!
নিউরো

1
সুতরাং আপনি এটি সংকলনযোগ্য হতে চেয়েছিলেন না, তবে আসলে এটি অন্তর্ভুক্ত সহ :)
টেকনাইকুইস্ট

1
@ টেকনাইকুইস্ট: হ্যাঁ, কিছু সহ std::;)
নিউরো

16

আপনি যদি std::to_stringসি ++ 11 থেকে ব্যবহার করতে না পারেন , তবে এটি সিপ্রেফারেন্স ডটকম-এ সংজ্ঞায়িত হিসাবে আপনি এটি লিখতে পারেন:

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"রূপান্তর করতে, hex উপস্থাপনায় int রূপান্তর করতে ব্যবহার করুন ইত্যাদি on


14

অ-মানক ফাংশন, তবে এটি বেশিরভাগ সাধারণ সংকলকগুলিতে প্রয়োগ করা হয়:

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

হালনাগাদ

সি ++ 11 বেশ কয়েকটি std::to_stringওভারলোডগুলি প্রবর্তন করেছে (নোট করুন এটি বেস -10 এ ডিফল্ট হয়েছে)।


3
@ ডেভসোলার: আপনার বিস্তারিত বলা উচিত। উত্সাহ উদাহরণ ইতিমধ্যে দেওয়া হয়েছিল। এই সমাধানটি বেশিরভাগ সংকলকগুলিতে পাওয়া যায় যখন বুস্ট ইনস্টল করা হয় না (বা আপনার প্রয়োজনীয়তা আপনাকে যে কোনও কারণেই এটি ব্যবহার করতে নিষেধ করে)। ostreamপাশাপাশি কাজ, আপনি একটি বাইনারি, অকট্যাল, অথবা হেক্স বিন্যাসে ছাড়া অন্য কিছু যেমন সংখ্যা স্ট্রিং সংরক্ষণ করতে হবে যতক্ষণ না (যেমন বেস-32)।
জ্যাক হাওল্যান্ড

3
যখন মানহীন ফাংশনগুলি কোনও কিছুর উত্তর হিসাবে দেওয়া হয় itoa()বা stricmp()দেওয়া হয় তখন আমি এটি পছন্দ করি না ।
দেবসোলার

6
আপনার সংবেদনগুলি ক্ষুণ্ন করার জন্য দুঃখিত, তবে আমি প্রথম বাক্যে এটি একটি মানহীন ফাংশন বলেছিলাম। আমি এটি উল্লেখ করি নি, তবে sprintfওপি'র লক্ষ্যটিও অর্জন করতে পারি (সাধারণ বেস নম্বরগুলি বাদে অন্য কোনও কিছুর প্রয়োজন হলে এখনও নমনীয়তার অভাবে ভুগছে)।
জ্যাক হাওল্যান্ড

1
হ্যাঁ আপনি এটি বর্ণনা করেছেন এবং আমি আপনার উত্তরটি হ্রাস করে নি, এমনকি যখন তা করতে আমার চুলকায়। সুতরাং আমি মনে করি আমরা সমান। ;-)
দেবসোলার

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: আপনি আমাকে বলুন কিভাবে একটি টেমপ্লেট পরিণত করতে এবং আমি সব সি ++ প্রকল্প আমি এই কনস্ট্রাক্ট ব্যবহার করছি আপডেট করব।
DevSolar

@ রুবেনভবি: দুঃখিত, এটি যতটা হওয়া উচিত ছিল তেমন পরিষ্কার ছিল না। আমি কীভাবে এটি ডেইজি-চেইন আউটপুটগুলির দক্ষতা (আমার দ্বিতীয় উদাহরণ হিসাবে) হারিয়ে না ফেলে বা হ্যান্ডেল করার জন্য একটি বিভ্রান্তিকর জগাখিচুড়ি না করেই টেমপ্লেটে (সি ++ 98 ব্যবহার করে) কীভাবে এটি রূপান্তর করতে পারি তার কোনও উপায় দেখছি না পরামিতি এবং পরামিতি প্রকারের যে কোনও সংখ্যা।
দেবসোলার

@ ডেভসোলার: করবেন না inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }? (পরীক্ষা করা হয়নি, তবে আমি ভাবছি কী ভুল হবে এবং কেন?
রুবেনভবি

@ রুবেনভবি: এটি কোনও ব্যক্তির পক্ষে করবে int(আমার প্রথম উদাহরণ)। কিন্তু ছাড়া ostreamএ কম্পাইলার কাছে দৃশ্যমান main(যেমন টেমপ্লেট ফাংশন মধ্যে লুকানো হয়), কীভাবে এটি দেখার চেষ্টা করবে operator<<()জন্য const char []আমার দ্বিতীয় উদাহরণে - যা অসন্তোষ প্রকাশ করা হবে না। আমি জানি ওপি কেবল একটি চেয়েছিল int, তবে এই আরও জেনেরিক ম্যাক্রো এতটাই দরকারী (এবং আসলে বেশ বিস্তৃত) যে আমি ভেবেছিলাম আমি এটি এখানে অন্তর্ভুক্ত করব।
দেবসোলার

বহুমুখিতা জন্য আমি একটি টেম্পলেট ফাংশন পছন্দ। ডেইজি-চেইনের জন্য সম্ভবত কিছুটা আরটিটিআই দিয়ে একই ফাংশনে পরিচালনা করা যায় ...
নিউরো

2

অন্তর্ভুক্ত intকরার std::stringপরে রূপান্তর করতে আপনি এই ফাংশনটি ব্যবহার করতে পারেন <sstream>:

#include <sstream>

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

0

আপনি আপনার প্রকল্পে itoa বাস্তবায়ন অন্তর্ভুক্ত করতে পারেন।
এখানে স্টাড :: স্ট্রিংয়ের সাথে কাজ করার জন্য এটি করা হয়েছে: http://www.strudel.org.uk/itoa/


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

এখানে, স্ট্রিং-তে int রূপান্তর করার আরও একটি সহজ উপায়

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/


এই মেথডেডার ফাইলগুলি ব্যবহার করার জন্য অবশ্যই নিম্নলিখিতগুলি অবশ্যই অন্তর্ভুক্ত থাকতে হবে # অন্তর্ভুক্ত <স্ট্রিং> # অন্তর্ভুক্ত <stdlib.h>
বিপুল ডুঙ্গরানী

-3

ধরুন আমার আছে integer = 0123456789101112। এখন, এই পূর্ণসংখ্যাটি stringstreamক্লাস দ্বারা একটি স্ট্রিংয়ে রূপান্তরিত হতে পারে ।

সি ++ তে কোডটি এখানে:

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

    }

অনেক বছর আগে ইতিমধ্যে প্রদত্ত অনুরূপ তবে আরও সম্পূর্ণ উত্তর ছিল না?
ওয়াল্টার

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