Como essa pergunta é feita toda semana, essas Perguntas frequentes podem ajudar muitos usuários.
Como converter um número inteiro em uma seqüência de caracteres em C ++
como converter uma seqüência de caracteres em um número inteiro em C ++
como converter um número de ponto flutuante em uma string em C ++
como converter uma seqüência de caracteres em um número de ponto flutuante em C ++
Respostas:
Atualização para C ++ 11
A partir do
C++11
padrão, a conversão de string para número e vice-versa são incorporadas à biblioteca padrão. Todas as seguintes funções estão presentes em<string>
(conforme o parágrafo 21.5).string para numérico
Cada um deles usa uma string como entrada e tenta convertê-la em um número. Se nenhum número válido puder ser construído, por exemplo, porque não há dados numéricos ou o número está fora do intervalo para o tipo, uma exceção é lançada (
std::invalid_argument
oustd::out_of_range
).Se a conversão for bem-sucedida e
idx
não for0
,idx
conterá o índice do primeiro caractere que não foi usado para decodificação. Este pode ser um índice por trás do último caractere.Finalmente, os tipos integrais permitem especificar uma base; para dígitos maiores que 9, o alfabeto é assumido (
a=10
atéz=35
). Você pode encontrar mais informações sobre a exata formatação que poderão analisado aqui para números de ponto flutuante , assinado inteiros e inteiros sem sinal .Finalmente, para cada função, há também uma sobrecarga que aceita a
std::wstring
como primeiro parâmetro.numérico para string
Isso é mais direto: você passa o tipo numérico apropriado e recebe uma string de volta. Para opções de formatação, você deve voltar à opção C ++ 03 stringsream e usar manipuladores de fluxo, conforme explicado em outra resposta aqui.
Conforme observado nos comentários, essas funções retornam a uma precisão mantissa padrão que provavelmente não é a precisão máxima. Se for necessária mais precisão para o seu aplicativo, também é melhor voltar para outros procedimentos de formatação de string.
Também existem funções semelhantes definidas que são nomeadas
to_wstring
; elas retornarão astd::wstring
.fonte
std::to_string
perde muita precisão para tipos de ponto flutuante. Por exemplo,double f = 23.4323897462387526; std::string f_str = std::to_string(f);
retorna uma sequência de 23.432390. Isso torna impossível arredondar os valores dos pontos flutuantes usando essas funções.sprintf(buf, fmt, val)
com um especificador de formato "% d " , "% u " , "% ld " , " % lu " , "% lld " , "% llu " , "% f " , "% f " ou "% Lf " , respectivamente, em quebuf
designa um buffer de caracteres interno de tamanho suficiente. "Eu tinha um olhar para o C99 padrão para printf e eu acho que o número de casas decimais é dependente#define DECIMAL_DIG
emfloat.h .Como converter um número em uma seqüência de caracteres em C ++ 03
itoa
ouitof
porque elas não são padrão e, portanto, não são portáteis.Use fluxos de sequência
Observe que você pode usar fluxos de sequência também para converter números de ponto flutuante em sequência e também para formatar a sequência como desejar, assim como com
cout
Você pode usar manipuladores de fluxo, tais como
std::endl
,std::hex
e funçõesstd::setw()
,std::setprecision()
etc., com correntes de cordas exatamente da mesma maneira que comcout
Não confunda
std::ostringstream
comstd::ostrstream
. Este último está obsoletoUsar boost elenco lexical . Se você não está familiarizado com o boost, é uma boa idéia começar com uma pequena biblioteca como esta lexical_cast. Para baixar e instalar o boost e sua documentação, clique aqui . Embora o boost não esteja no padrão C ++, muitas bibliotecas de boost são padronizadas eventualmente e o boost é amplamente considerado uma das melhores bibliotecas C ++.
O elenco lexical usa fluxos por baixo, então basicamente essa opção é a mesma que a anterior, apenas menos detalhada.
Como converter uma seqüência de caracteres em um número em C ++ 03
A opção mais leve, herdada de C, são as funções
atoi
(para números inteiros (em ordem alfabética para número inteiro)) eatof
(para valores de ponto flutuante (em ordem alfabética para flutuar)). Essas funções aceitam uma string no estilo C como argumento (const char *
) e, portanto, seu uso pode ser considerado uma prática não exatamente boa do C ++. O cplusplus.com possui uma documentação fácil de entender, tanto no atoi quanto no atof, incluindo como eles se comportam em caso de insatisfação . No entanto, o link contém um erro, de acordo com o padrão, se o número de entrada for muito grande para caber no tipo de destino, o comportamento será indefinido.Use fluxos de cadeia (desta vez insira fluxo de cadeia
istringstream
). Novamente, o istringstream é usado da mesma maneiracin
. Mais uma vez, não confundaistringstream
comistrstream
. O último está obsoleto.Usar elenco lexical de reforço .
No caso de uma entrada incorreta,
lexical_cast
lança uma exceção do tipoboost::bad_lexical_cast
fonte
atoi
não é excelente, está incorreta. Ele não menciona que, se o valor numérico da sequência não puder ser representadoint
, o comportamento será indefinido. Em vez disso, diz que valores fora do intervalo estão fixados emINT_MAX
/INT_MIN
, o que não consigo encontrar no C ++ 03 ou no C89. Para entradas não confiáveis / não verificadas ou ao lidar com bases que os fluxos não suportam, você precisastrtol
definir um comportamento de erro. E comentários semelhantes paraatof
/strtod
.(int)strtol(nptr, (char **)NULL, 10)
. As funções [...] atoi retornam o valor convertido.". cplusplus.com é conhecido por ser uma incrível fonte ruim de informações para iniciantes.istr >> i1 >> f >> i2;
falta muito de um cheque de sucesso.std::to_string
No C ++ 17, novas funções std :: to_chars e std :: from_chars são introduzidas no cabeçalho charconv .
De std :: to_chars , o mesmo para std :: from_chars .
Embora não seja totalmente implementado pelos compiladores, definitivamente será implementado.
fonte
Eu roubei essa classe conveniente de algum lugar aqui no StackOverflow para converter qualquer coisa streamable em uma string:
E então você o usa como;
Bastante bacana!
Também uso essa função para converter seqüências de caracteres para qualquer coisa que possa ser estriada, apesar de não ser muito seguro se você tentar analisar uma sequência que não contém um número; (e não é tão inteligente quanto o último)
Use como:
Você também pode querer versões para wstrings.
fonte