Pergunta

Existe uma maneira de converter um personagem para um número inteiro em C?

Por exemplo, a partir '5' a 5?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top