Converter um dígito de caracteres para o inteiro correspondente em C
-
07-07-2019 - |
Pergunta
Existe uma maneira de converter um personagem para um número inteiro em C?
Por exemplo, a partir '5'
a 5?
Solução
De acordo com outras respostas, isso é bom:
char c = '5';
int x = c - '0';
Além disso, para a verificação de erros, você pode querer verificar isdigit (c) é verdadeira em primeiro lugar. Nota que você não pode completamente portably fazer o mesmo por cartas, por exemplo:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
As garantias padrão que os valores de char para o dígitos '0' a '9' são contíguas, mas não faz nenhuma garantia para outros personagens como as letras do alfabeto.
Outras dicas
Subtrair '0' como este:
int i = c - '0';
O C Padrão garante cada dígito do '0'..'9'
gama é maior do que a sua dígito anterior (na secção de 5.2.1/3
o C99 projecto ). O mesmo se aplica para C ++.
Se, por alguma coincidência louco, que pretende converter um string de caracteres para um número inteiro, você pode fazer isso também!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
é agora 1024. Aparentemente atoi()
é bom, eo que eu disse sobre isso anteriormente só se aplica a mim (no OS X (talvez (inserir piada Lisp aqui))). Ouvi dizer que é uma macro que mapeia mais ou menos para o próximo exemplo, que usa strtol()
, uma função mais de uso geral, para fazer a conversão em vez disso:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
funciona assim:
long strtol(const char *str, char **endptr, int base);
Ele converte *str
a um long
, tratando-o como se fosse um número base
base. Se **endptr
não é nulo, ele ocupa o primeiro strtol()
caracteres não dígitos encontrado (mas quem se importa com isso).
Subtrair char '0' ou int 48 como esta:
char c = '5';
int i = c - '0';
Explicação: Internamente ele funciona com ASCII valor . Da tabela ASCII, o valor decimal da personagem 5 é 53 e 0 é 48 . Então 53-48 = 5
ou
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
isso significa que se você deduzir 48 a partir de qualquer caractere numeral, ele irá converter inteiro automaticamente.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
Para converter dígitos personagem inteiro correspondente. Faça como mostrado abaixo:
char c = '8';
int i = c - '0';
Logic por trás do cálculo acima é jogar com os valores ASCII. valor ASCII do caráter 8 é 56, valor ASCII do caractere 0 é 48. valor ASCII inteiro de 8 a 8.
Se subtrairmos duas personagens, subtração vai acontecer entre ASCII de caracteres.
int i = 56 - 48;
i = 8;
Se for apenas um único caractere 0-9 em ASCII, em seguida, subtraindo o valor do caráter ASCII zero a partir valor ASCII deve funcionar bem.
Se você deseja converter números maiores, em seguida, o seguinte irá fazer:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** não se esqueça de verificar o estado (que deve ser 1 se ele trabalhou no caso acima).
Paul.
char chVal = '5';
char chIndex;
if ((chVal >= '0') && (chVal <= '9')) {
chIndex = chVal - '0';
}
else
if ((chVal >= 'a') && (chVal <= 'z')) {
chIndex = chVal - 'a';
}
else
if ((chVal >= 'A') && (chVal <= 'Z')) {
chIndex = chVal - 'A';
}
else {
chIndex = -1; // Error value !!!
}
Quando eu preciso fazer algo assim I de pré-cozimento uma matriz com os valores que eu quero.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Em seguida, a conversão é fácil
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
Esta é basicamente a abordagem adoptada por muitas implementações da biblioteca ctype. Você pode trivialmente adaptar este para trabalhar com dígitos hexadecimais também.
Verificar isso,
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
apenas 0,1,2, ...., E, F.
Basta usar o atol()
function:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Se o seu dígito é, digamos, '5'
, em ASCII é representado como o 0011 0101
número binário (53). Cada dígito tem a maior quatro bits 0011
e os menores de 4 bits representam o dígito BCD. Então você acabou de fazer
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
para obter os mais baixos de 4 bits, ou, o que seu mesmo, o dígito. Em asm, ele usa a operação and
vez de sub
(como em outras respostas).
função uso: atoi para matriz de número inteiro, para atof matriz de tipo flutuante; ou
char c = '5';
int b = c - 48;
printf("%d", b);
Você iria lançá-lo para um int (ou float ou double ou que nunca mais você quer fazer com ele) e armazená-lo em anoter variável.