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.
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 ...
@ 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 =newchar[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.
@ 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 );return0;}
@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>:
Você pode incluir a implementação do itoa em seu projeto.
Aqui está o itoa modificado para trabalhar com std :: string: http://www.strudel.org.uk/itoa/
to_string
comostd::string s = std::to_string(42)
Respostas:
Você pode usar std :: to_string no C ++ 11
fonte
fonte
boost::lexical_cast<std::string>(yourint)
deboost/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:
fonte
lexical_cast
traz, mas sinto que o Boost é um exagero para esse tipo de tarefa ...Bem, a maneira bem conhecida de fazer isso é usar o operador de fluxo:
Claro que você pode generalizá-lo para qualquer tipo usando uma função de modelo ^^
fonte
#include <sstream>
.std::
;) #Se você não pode usar o
std::to_string
C ++ 11, você pode escrevê-lo conforme definido em cppreference.com:Implementação
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.fonte
Função não padrão, mas implementada nos compiladores mais comuns:
Atualizar
O C ++ 11 introduziu várias
std::to_string
sobrecargas (observe que o padrão é base-10).fonte
ostream
funciona, 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).itoa()
oustricmp()
são dadas como resposta a qualquer coisa .sprintf
també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).A macro a seguir não é tão compacta quanto um uso único
ostringstream
ouboost::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:
Explicação:
A
std::dec
é uma maneira de lado sem efeito para fazer o anônimoostringstream
em um genéricoostream
de modooperator<<()
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_cast
retorna o tipo de volta paraostringstream
que você possa chamarstr()
nele.Usar:
fonte
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ê?int
(meu primeiro exemplo). Mas sem oostream
visível para o compilador nomain
(como ele está escondido dentro da função de modelo), ele vai tentar olhar para cimaoperator<<()
paraconst char []
no meu segundo exemplo - que irá coaxar. Eu sei que o OP pediu apenas umaint
, mas essa macro mais genérica é tão útil (e na verdade bastante difundida) que pensei em incluí-la aqui.Você pode usar esta função para converter
int
parastd::string
depois, incluindo<sstream>
:fonte
Você pode incluir a implementação do itoa em seu projeto.
Aqui está o itoa modificado para trabalhar com std :: string: http://www.strudel.org.uk/itoa/
fonte
Aqui está outra maneira fácil de converter int para string
você pode visitar este link para obter mais métodos https://www.geeksforgeeks.org/what-is-the-best-way-in-c-to-convert-a-number-to-a-string/
fonte
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 ++:
fonte