Bir int'i std :: string'e dönüştürme


143

Bir int'i dizgeye dönüştürmenin en kısa yolu, tercihen satır içi yetenekli olan nedir? Stl ve boost kullanarak cevaplar memnuniyetle karşılanacaktır.



63
C ++ 11'de to_stringbeğenebilirsinizstd::string s = std::to_string(42)

5
Yaşasın C ++ 11 ve to_string! :)
Ağustos

Yanıtlar:


351

C ++ 11'de std :: to_string kullanabilirsiniz

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

4
std :: to_string () MinGW'de çalışmıyorsa, kimse ilgilenmez.
Archie

3
@bparker Doğru, gcc 4.8.0'da düzeltildi sanırım. En son Code :: Blocks (13.12) ile gelen MinGW hala gcc 4.7.1'e sahiptir.
Archie

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) itibaren boost/lexical_cast.hpp

İş std :: ostream desteği olan her şey içindir, ancak örneğin, itoa

Hatta stringstream veya scanf'den daha hızlı görünüyor:


15
Standart C ++ 'da bunu yapmanın basit bir yolu olmasaydı, Boost arkadaşınızdır ... Tabii ki ne lexical_castgetiriyor gibi , ama
Boost'un

2
Aşırı yükleme? Neye bağlı olarak? boost.org/doc/libs/1_53_0/doc/html/boost_lexical_cast/…
Catskul

Boost'u kullanamazlarsa kitlenizi düşünmelisiniz
Damian

5
"Stl ve boost kullanan cevaplar memnuniyetle karşılanacaktır." - İzleyici dikkate
Conrad Jones

30

Bunu yapmanın iyi bilinen yolu akış operatörünü kullanmaktır:

#include <sstream>

std::ostringstream s;
int i;

s << i;

std::string converted(s.str());

Tabii ki bir şablon işlevi kullanarak herhangi bir tür için genelleştirebilirsiniz ^^

#include <sstream>

template<typename T>
std::string toString(const T& value)
{
    std::ostringstream oss;
    oss << value;
    return oss.str();
}

1
Not: Bu gerektirir #include <sstream>.
TechNyquist

@TechNyquist: Haklısın. Derlenebilir değil, değişti!
nöro

1
Yani derlenebilir demek istemedin, ama aslında içerme ile :)
TechNyquist

1
@TechNyquist: Evet, bazılarıyla std::;)
nöro

16

std::to_stringC ++ 11'den kullanamıyorsanız , cppreference.com'da tanımlandığı gibi yazabilirsiniz:

std::string to_string( int value ) İşaretli ondalık tamsayıyı, std::sprintf(buf, "%d", value)yeterince büyük buf için üretilecek içerikle aynı dizeye dönüştürür .

uygulama

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

Bununla daha fazlasını yapabilirsiniz. Sadece "%g"float veya double dize "%x"dönüştürmek için kullanın , int onaltılık temsile dönüştürmek için kullanın , vb.


14

Standart olmayan işlev, ancak en yaygın derleyicilere uygulanır:

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

Güncelleme

C ++ 11 birkaç std::to_stringaşırı yük getirdi (varsayılan olarak taban-10'a dikkat edin).


3
@DevSolar: Ayrıntılandırmalısınız. Güçlendirme örneği zaten verilmişti. Bu çözüm, yükseltme kurulmadığında çoğu derleyicide bulunur (veya gereksinimleriniz herhangi bir nedenle onu kullanmanızı engeller). ostreamSıra eserler, bir ikili, sekizli veya onaltılık biçimden farklı bir şey olarak numara-string kaydetmeniz gerekir dek (örn baz-32).
Zac Howland

3
Standart dışı fonksiyonları gibi zaman bunu sevmiyorum itoa()ya stricmp()cevap olarak verilmiştir şey .
DevSolar

6
Hassasiyetlerinizi bozduğum için üzgünüm, ama ilk cümlede standart olmayan bir işlev olduğunu belirtmiştim. Bahsetmedim, ancak sprintfOP'nin amacını da başarabilirim (yine de ortak taban numaralarından başka bir şey gerekiyorsa esneklikten muzdarip olsa da).
Zac Howland

1
Evet, siz söylediniz, ve bunu yapmak için beni kaşındığında bile cevabınızı küçümsemedim. Bence biz bile. ;-)
DevSolar

8

Aşağıdaki makro, tek kullanımlık kadar kompakt değil ostringstreamveyaboost::lexical_cast .

Ancak kodunuzda art arda dizeye dönüştürmeye ihtiyacınız varsa, bu makro kullanımda her zaman doğrudan dize akışlarını veya açık dökümleri kullanmaktan daha zariftir.

Ayrıca çok yönlüdür, çünkü desteklenen her şeyi dönüştürüroperator<<() arada bile .

Tanım:

#include <sstream>

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
            ( std::ostringstream() << std::dec << x ) ).str()

Açıklama:

std::decİsminin gizli yapmak için bir yan etkisi içermeyen bir yoldur ostringstreamjenerik içine ostreamSooperator<<() işlev arama her türlü düzgün çalışır. (Aksi takdirde, ilk argüman bir işaretçi türüyse sorun yaşarsınız.)

dynamic_castTip geri döner ostringstreamArayabileceğin böylecestr() .

kullanın:

#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: Bunu nasıl bir şablona dönüştüreceğinizi söylüyorsunuz ve bu yapıyı kullandığım tüm C ++ projelerini güncelleyeceğim.
DevSolar

@rubenvb: Üzgünüm, olması gerektiği kadar net değildi. Papatya zinciri çıktılarını (ikinci örneğimde olduğu gibi) yeteneğini kaybetmeden veya işlemek için kıvrık bir karmaşa bulmak zorunda kalmadan bunu (C ++ 98 kullanarak) bir şablona dönüştürebileceğimin bir yolunu görmüyorum herhangi bir sayıda parametre ve parametre türü.
DevSolar

@DevSolar: Yapmaz mıydı inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }? (Have test edilmedi, ama yanlış ve neden gitmek ne merak mı?
rubenvb

@rubenvb: Birey için yapardı int(ilk örneğim ). Ama olmadan ostreamiçinde derleyici tarafından görülebilir main(bu şablon işlevi içinde gizlidir gibi), o kadar bakmaya çalışacağım operator<<()için const char []benim ikinci örnekteki - croak hangi. OP sadece bir istedi istedi int, ama bu daha genel makro o kadar yararlı (ve aslında oldukça yaygın) buraya dahil olacağını düşündüm.
DevSolar

Çok yönlülük için bir şablon fonksiyonunu tercih ederim. Belki de RTTI bir parça aynı işleve ele alınabilir papatya zinciri ... için
nöro

2

Aşağıdakileri ekledikten sonra dönüştürmek intiçin bu işlevi kullanabilirsiniz :std::string<sstream>

#include <sstream>

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


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

Burada, int'i dizeye dönüştürmenin başka bir kolay yolu

int n = random(65,90);
std::string str1=(__String::createWithFormat("%c",n)->getCString());

daha fazla yöntem için bu bağlantıyı ziyaret edebilirsiniz https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/


Bu methodheader dosyalarını kullanmak için aşağıdakileri içermelidir #include <string> #include <stdlib.h>
Vipul Dungranee

-3

Varsayalım integer = 0123456789101112. Şimdi, bu tam sayı stringstreamsınıf tarafından bir dizeye dönüştürülebilir .

İşte C ++ kodu:

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

    }

benzer değildi ama yıllar önce verilen daha eksiksiz cevaplar?
Walter

Evet, ama bu cevap mükemmel, sanırım öncekinden etkili bir cevap alamadım.
Shawon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.