Basta ter uma pergunta rápida. Examinei bastante a Internet e encontrei algumas soluções, mas nenhuma delas funcionou ainda. Olhando para converter uma string em int e não quero dizer códigos ASCII.
Para uma rápida decomposição, somos passados em uma equação como uma string. Devemos decompô-lo, formatá-lo corretamente e resolver as equações lineares. Agora, ao dizer isso, não consigo converter uma string em um int.
Eu sei que a string estará no formato (-5) ou (25) etc., por isso é definitivamente um int. Mas como extraímos isso de uma string?
Uma maneira que eu estava pensando em executar um loop for / while na string, verifique se há um dígito, extraia todos os dígitos depois disso e verifique se havia um '-' inicial, se houver, multiplique o int por - 1
Parece um pouco complicado demais para um problema tão pequeno. Alguma ideia?
atoi()
?std::string
myString
e deseja usaratoi
, então você quer dizeratoi(myString.c_str())
.Respostas:
No C ++ 11, existem algumas novas e agradáveis funções de conversão de
std::string
para um tipo de número.Então, ao invés de
você pode usar
Onde
str
está o seu número comostd::string
.Há versão para todos os sabores de números:
long stol(string)
,float stof(string)
,double stod(string)
, ... ver http://en.cppreference.com/w/cpp/string/basic_string/stolfonte
"11x"
em número inteiro11
.from_chars
do C ++ 17? Supõe-se que sejam ordens de magnitude mais rápidas questoi
.stoi
deve ser preferido. Consulte Por que não devo usar atoi ()?Para estar totalmente correto, convém verificar os sinalizadores de erro.
fonte
-5
de(-5)
.As opções possíveis estão descritas abaixo:
1. Primeira opção: sscanf ()
Este é um erro (também mostrado pelo cppcheck) porque "scanf sem limites de largura de campo pode travar com enormes dados de entrada em algumas versões da libc" (veja aqui e aqui ).
2. Segunda opção: std :: sto * ()
Essa solução é curta e elegante, mas está disponível apenas em compiladores compatíveis com C ++ 11.
3. Terceira opção: fluxos
No entanto, com esta solução é difícil distinguir entre entrada incorreta (veja aqui ).
4. Quarta opção: lexical_cast da Boost
No entanto, este é apenas um invólucro
sstream
e a documentação sugere usarsstream
para um melhor gerenciamento de erros (veja aqui ).5. Quinta opção: strto * ()
Esta solução é muito longa, devido ao gerenciamento de erros, e é descrita aqui. Como nenhuma função retorna um int simples, é necessária uma conversão no caso de um número inteiro (consulte aqui como obter essa conversão).
6. Sexta opção: Qt
Conclusões
Resumindo, a melhor solução é o C ++ 11
std::stoi()
ou, como segunda opção, o uso de bibliotecas Qt. Todas as outras soluções são desencorajadas ou com erros.fonte
use a função atoi para converter a string em um número inteiro:
http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
fonte
atoi
.strtol
faz tudoatoi
faz, mas melhor, e falha com segurança.E o Boost.Lexical_cast ?
Aqui está o exemplo deles:
fonte
É certo que minha solução não funcionaria para números inteiros negativos, mas extrairá todos os números inteiros positivos do texto de entrada que contém números inteiros. Faz uso do
numeric_only
código do idioma:Entrada de texto:
Inteiros de saída:
A classe
numeric_only
é definida como:Demonstração on-line completa: http://ideone.com/dRWSj
fonte
Provavelmente é um pouco exagerado, mas
boost::lexical_cast<int>( theString )
deve funcionar muito bem.fonte
boost::lexical_cast<int>( theString )
(ondetheString
é o nome da variável que contém a string que você deseja converterint
).atoi
é uma função interna que converte uma sequência em um número inteiro, assumindo que a sequência começa com uma representação inteira.http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/
fonte
atoi
, use-ostrtol
.No Windows, você pode usar:
strtol
, éstringstream
necessário especificar a base se você precisar interpretar hexdecimal.fonte
Bem, muitas respostas, muitas possibilidades. O que estou perdendo aqui é algum método universal que converte uma string em diferentes tipos integrais de C ++ (short, int, long, bool, ...). Eu vim com a seguinte solução:
Aqui estão alguns exemplos de uso:
Por que não usar o operador de saída stringstream para converter uma string em um tipo integral? Aqui está a resposta: Digamos que uma string contenha um valor que exceda o limite para o tipo integral pretendido. Por exemplo, no Wndows 64 max int é 2147483647. Vamos atribuir a uma string um valor max int + 1: string str = "2147483648". Agora, ao converter a string em um int:
x se torna 2147483647, o que definitivamente é um erro: a string "2147483648" não deveria ser convertida na int 2147483647. A função fornecida toIntegralType identifica esses erros e gera uma exceção.
fonte
Em http://www.cplusplus.com/reference/string/stoi/
Resultado:
2001, A Space Odyssey: 2001 e [, A Space Odyssey]
40c3: 16579
-10010110001: -1201
0x7f: 127
fonte
Meu código:
fonte
fonte
Para converter de representação de string em valor inteiro, podemos usar std :: stringstream.
se o valor convertido estiver fora do intervalo para o tipo de dados inteiro, ele retornará INT_MIN ou INT_MAX.
Além disso, se o valor da sequência não puder ser representado como um tipo de dados int válido, será retornado 0.
Saída: 50
De acordo com a saída acima, podemos vê-lo convertido de números de string em número inteiro.
Origem e mais na string para int c ++
fonte
Versão de uma linha:
long n = strtol(s.c_str(), NULL, base);
.(
s
é a sequência ebase
éint
2, 8, 10, 16.)Você pode consultar este link para obter mais detalhes sobre
strtol
.A idéia principal é usar a
strtol
função, incluída emcstdlib
.Como
strtol
apenas lida comchar
matriz, precisamos converterstring
emchar
matriz. Você pode consultar este link .Um exemplo:
que produzirá:
fonte
existe outra maneira fácil: suponha que você tenha um personagem como
c='4'
portanto, você pode executar uma destas etapas:1º: int q
q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .
a segunda maneira:
q=c-'0'; the same , character '0' means 48
fonte
string
paraint
em vez dechar
parastring
.