Existe uma maneira de converter um caractere em um inteiro em C?
Por exemplo, de '5'
a 5?
c
type-conversion
Fluxo
fonte
fonte
Subtraia '0' assim:
O padrão C garante que cada dígito no intervalo
'0'..'9'
seja um maior que o dígito anterior (na seção5.2.1/3
do rascunho C99 ). O mesmo vale para C ++.fonte
Se, por alguma coincidência maluca, você quiser converter uma sequência de caracteres em um inteiro, você também pode fazer isso!
val
agora é 1024. Aparentementeatoi()
está bem, e o que eu disse sobre isso antes só se aplica a mim (no OS X (talvez (insira a piada do Lisp aqui))). Ouvi dizer que é uma macro que mapeia aproximadamente para o próximo exemplo, que usastrtol()
uma função de uso mais geral para fazer a conversão:strtol()
funciona assim:Ele é convertido
*str
em umlong
, tratando-o como se fosse umbase
número base . Se**endptr
não for nulo, ele contém o primeiro caractere diferente de dígitostrtol()
encontrado (mas quem se importa com isso).fonte
itoa_s()
.Subtraia char '0' ou int 48 assim:
Explicação: Internamente, funciona com valor ASCII . Na tabela ASCII, o valor decimal do caractere 5 é 53 e 0 é 48 . Então 53 - 48 = 5
OU
Isso significa que se você deduzir 48 de qualquer caractere numérico, ele converterá o inteiro automaticamente.
fonte
fonte
numeralChar - '0'
já é do tipoint
, então você não precisa do elenco. Mesmo se não fosse, o gesso não é necessário.Para converter o dígito do caractere em um inteiro correspondente. Faça como mostrado abaixo:
A lógica por trás do cálculo acima é brincar com os valores ASCII. O valor ASCII do caractere 8 é 56, o valor ASCII do caractere 0 é 48. O valor ASCII do inteiro 8 é 8.
Se subtrairmos dois caracteres, a subtração acontecerá entre ASCII de caracteres.
fonte
Se for apenas um único caractere 0-9 em ASCII, subtrair o valor do caractere ASCII zero do valor ASCII deve funcionar bem.
Se você deseja converter números maiores, faça o seguinte:
** não se esqueça de verificar o status (que deve ser 1 se funcionou no caso acima).
Paulo.
fonte
fonte
Quando preciso fazer algo assim, pré-preparo um array com os valores que desejo.
Então a conversão é fácil
Essa é basicamente a abordagem adotada por muitas implementações da biblioteca ctype. Você pode adaptar isso trivialmente para funcionar com dígitos hexadecimais também.
fonte
Verifique isso,
para apenas 0,1,2, ...., E, F.
fonte
Basta usar a
atol()
função:fonte
Se o seu dígito for, digamos,
'5'
em ASCII, ele será representado como o número binário0011 0101
(53). Cada dígito tem os quatro bits mais altos0011
e os 4 bits mais baixos representam o dígito em bcd. Então você apenas fazpara obter os 4 bits mais baixos, ou, o que é igual, o dígito. Em asm, ele usa
and
operação em vez desub
(como nas outras respostas).fonte
'5'
é 53 (00110101
)Aqui estão as funções auxiliares que permitem converter dígito em char para int e vice-versa:
fonte
use a função: atoi para array para inteiro, atof para array para tipo float; ou
fonte
Você o lançaria em um int (ou float ou double ou o que quer que você queira fazer com ele) e o armazenaria em outra variável.
fonte