Convertendo um int em std :: string


143

Qual é a maneira mais curta, de preferência com capacidade de linha, para converter um int em uma string? Respostas usando stl e boost serão bem-vindas.



63
No C ++ 11 você pode usar to_stringcomostd::string s = std::to_string(42)

5
Viva C ++ 11 e to_string! :)
agosto

Respostas:


350

Você pode usar std :: to_string no C ++ 11

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

4
std :: to_string () não funciona no MinGW, se alguém se importa.
Archie

3
@bparker Certo, foi corrigido no gcc 4.8.0, eu acho. O MinGW que vem com o Code :: Blocks (13.12) mais recente ainda possui o gcc 4.7.1.
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) de boost/lexical_cast.hpp

Funciona para tudo com o suporte std :: ostream, mas não é tão rápido quanto, por exemplo, itoa

Parece até mais rápido que o stringstream ou scanf:


15
O Boost é seu amigo, se não houvesse uma maneira simples de fazer isso no C ++ padrão ... É claro que gosto do que lexical_casttraz, mas sinto que o Boost é um exagero para esse tipo de tarefa ...
rubenvb


Deve considerar seu público, se eles não puderem usar o Boost
Damian

5
"Respostas usando stl e boost serão bem-vindas." - Público-alvo considerado
Conrad Jones

30

Bem, a maneira bem conhecida de fazer isso é usar o operador de fluxo:

#include <sstream>

std::ostringstream s;
int i;

s << i;

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

Claro que você pode generalizá-lo para qualquer tipo usando uma função de modelo ^^

#include <sstream>

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

1
Nota: isso requer #include <sstream>.
TechNyquist

@ TechNyquist: Você está certo. Não era para ser compilável, mas mudou!
Neuro

1
Então você não queria dizer que ele seja compilable, mas na verdade com a incluí-lo é :)
TechNyquist

1
@TechNyquist: Sim, com alguns std::;) #
neuro

16

Se você não pode usar o std::to_stringC ++ 11, você pode escrevê-lo conforme definido em cppreference.com:

std::string to_string( int value ) Converte um número inteiro decimal assinado em uma sequência com o mesmo conteúdo que o std::sprintf(buf, "%d", value)que produziria para um buf suficientemente grande.

Implementação

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

Você pode fazer mais com isso. Apenas use "%g"para converter float ou double em string, use "%x"para converter representação int em hexadecimal e assim por diante.


14

Função não padrão, mas implementada nos compiladores mais comuns:

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

Atualizar

O C ++ 11 introduziu várias std::to_stringsobrecargas (observe que o padrão é base-10).


3
@ DevSolar: Você deve elaborar. O exemplo do impulso já havia sido dado. Esta solução está disponível na maioria dos compiladores quando o boost não está instalado (ou seus requisitos o proíbem de usá-lo por qualquer motivo). Também ostreamfunciona, até que você precise salvar a sequência numérica como algo diferente de um formato binário, octal ou hexadecimal (por exemplo, base-32).
Zac Howland

3
Não gosto quando funções fora do padrão gostam itoa()ou stricmp()são dadas como resposta a qualquer coisa .
DevSolar 12/01

6
Desculpe ofender suas sensibilidades, mas afirmei que era uma função não padrão na primeira frase. Eu não mencionei isso, mas sprintftambém posso cumprir o objetivo do OP (embora ainda sofra com a falta de flexibilidade se for necessário algo diferente dos números de base comuns).
Zac Howland

1
Sim, você declarou, e eu não neguei sua resposta, mesmo quando isso me doía. Então acho que estamos quites. ;-)
DevSolar 12/01

8

A macro a seguir não é tão compacta quanto um uso único ostringstreamou boost::lexical_cast.

Mas se você precisar de conversão para string repetidamente em seu código, essa macro será mais elegante em uso do que manipular diretamente strings de seqüência de caracteres ou conversão explícita sempre.

Também é muito versátil, pois converte tudo o que é suportado operator<<(), mesmo em combinação.

Definição:

#include <sstream>

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

Explicação:

A std::decé uma maneira de lado sem efeito para fazer o anônimo ostringstreamem um genérico ostreamde modo operator<<()lookup função funciona corretamente para todos os tipos. (Caso contrário, você terá problemas se o primeiro argumento for do tipo ponteiro.)

O dynamic_castretorna o tipo de volta para ostringstreamque você possa chamar str()nele.

Usar:

#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: Você me diz como transformar isso em um modelo e eu vou atualizar todos os projetos do C ++ Eu tenho usado essa construção no.
DevSolar

@rubenvb: Desculpe, isso não estava tão claro como deveria ter sido. Não vejo uma maneira de transformar isso em um modelo (usando C ++ 98) sem perder a capacidade de ligar em cadeia as saídas (como no meu segundo exemplo) ou ter que criar uma bagunça complicada para lidar com isso. qualquer número de parâmetros e tipos de parâmetros.
DevSolar

@ DevSolar: não inline template<class T> std::string SSTR( T x ) { return dynamic_cast< std::ostringstream & >( (std::ostringstream() << std::dec << x) ).str() }faria? (Não testei, mas eu me pergunto o que iria dar errado e por quê?
rubenvb

@ Rubenvb: Seria para um indivíduo int(meu primeiro exemplo). Mas sem o ostreamvisível para o compilador no main(como ele está escondido dentro da função de modelo), ele vai tentar olhar para cima operator<<()para const char []no meu segundo exemplo - que irá coaxar. Eu sei que o OP pediu apenas uma int, mas essa macro mais genérica é tão útil (e na verdade bastante difundida) que pensei em incluí-la aqui.
DevSolar 12/01

Pela versatilidade, prefiro uma função de modelo. Para o em cadeia, talvez, que pode ser tratado da mesma função com um pouco de RTTI ...
neuro

2

Você pode usar esta função para converter intpara std::stringdepois, incluindo <sstream>:

#include <sstream>

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



-3

Suponha que eu tenha integer = 0123456789101112. Agora, esse número inteiro pode ser convertido em uma string pelostringstream classe.

Aqui está o código em C ++:

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

    }

não foram semelhantes, mas respostas mais completas já foram dadas há muitos anos?
1313 Walter Walter

Sim, mas acho que essa resposta é perfeita, pois não recebi nenhuma resposta eficaz da anterior.
Shawon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.