Convierte un dígito de carácter en el entero correspondiente en C

¿Hay alguna manera de convertir un personaje a un número entero en C?

Por ejemplo, de '5' a 5?

Según otras respuestas, esto está bien:

 char c = '5'; int x = c - '0'; 

Además, para la comprobación de errores, es posible que desee verificar que isdigit (c) sea verdadero primero. Tenga en cuenta que no puede hacer lo mismo de manera completamente portátil para las letras, por ejemplo:

 char c = 'b'; int x = c - 'a'; // x is now not necessarily 1 

El estándar garantiza que los valores de char para los dígitos ‘0’ a ‘9’ son contiguos, pero no ofrece garantías para otros caracteres, como las letras del alfabeto.

Reste ‘0’ de esta manera:

 int i = c - '0'; 

El estándar C garantiza que cada dígito en el rango '0'..'9' es uno mayor que su dígito anterior (en la sección 5.2.1/3 del borrador C99 ). Lo mismo cuenta para C ++.

Si, por alguna loca coincidencia, quieres convertir una cadena de caracteres en un entero, ¡también puedes hacerlo!

 char *num = "1024"; int val = atoi(num); // atoi = ASCII TO Int 

val es ahora 1024. Aparentemente atoi() está bien, y lo que dije antes solo se aplica a mí (en OS X (tal vez (inserte el chiste de Lisp aquí))). He oído que es una macro que se aproxima aproximadamente al siguiente ejemplo, que usa strtol() , una función más general, para hacer la conversión:

 char *num = "1024"; int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long 

strtol() funciona así:

 long strtol(const char *str, char **endptr, int base); 

Convierte *str a un long , tratándolo como si fuera un número base de base . Si **endptr no es nulo, contiene el primer carácter no- strtol() encontrado (pero a quién le importa eso).

 char numeralChar = '4'; int numeral = (int) (numeralChar - '0'); 

Reste el carácter ‘0’ o int 48 de esta manera:

 char c = '5'; int i = c - '0'; 

O

 char c = '5'; int i = c - 48; // Because decimal value of char '0' is 48 

Para convertir el dígito del personaje al entero correspondiente. Haz lo que se muestra a continuación:

 char c = '8'; int i = c - '0'; 

La lógica detrás del cálculo anterior es jugar con valores ASCII. El valor ASCII del caracter 8 es 56, el valor ASCII del caracter 0 es 48. El valor ASCII del entero 8 es 8.

Si restamos dos caracteres, la resta ocurrirá entre los caracteres ASCII.

 int i = 56 - 48; i = 8; 

Si se trata de un solo carácter 0-9 en ASCII, restar el valor del carácter cero ASCII del valor ASCII debería funcionar bien.

Si desea convertir números más grandes, lo siguiente será:

 char *string = "24"; int value; int assigned = sscanf(string, "%d", &value); 

** no se olvide de verificar el estado (que debe ser 1 si funcionó en el caso anterior).

Pablo.

 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 !!! } 

Cuando necesito hacer algo como esto, preparo una matriz con los valores que quiero.

 const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... }; 

Entonces la conversión es fácil

 int digit_to_int( unsigned char c ) { return lookup[ static_cast(c) ]; } 

Este es básicamente el enfoque adoptado por muchas implementaciones de la biblioteca ctype. También puedes adaptarlo trivialmente para trabajar con dígitos hexadecimales.

Mira esto,

 char s='A'; int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10); 

por solo 0,1,2, ...., E, F.

Simplemente use la función atol() :

 #include  #include  int main() { const char *c = "5"; int d = atol(c); printf("%d\n", d); } 

Si su dígito es, por ejemplo, '5' , en ASCII se representa como el número binario 0011 0101 (53). Cada dígito tiene los cuatro bits más altos 0011 y los 4 bits más bajos representan el dígito en bcd. Así que lo haces

 char cdig = '5'; int dig = cdig & 0xf; // dig contains the number 5 

para obtener los 4 bits más bajos, o lo que es lo mismo, el dígito. En asm, usa and opera en lugar de sub (como en las otras respuestas).

use function: atoi para array a entero, atof para array a float type; o

 char c = '5'; int b = c - 48; printf("%d", b); 

Lo convertirías en un int (o float o double o lo que sea que quieras hacer con él) y lo almacenarás en una variable anoter.