Pregunta

¿Hay alguna forma de convertir un carácter en un entero en C?

Por ejemplo, de '5' a 5?

¿Fue útil?

Solución

Según otras respuestas, está bien:

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

Además, para la comprobación de errores, es posible que desee comprobar que isdigit (c) es 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 caracteres para los dígitos '0' a '9' son contiguos, pero no garantiza otros caracteres como letras del alfabeto.

Otros consejos

Resta '0' así:

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 de el borrador C99 ). Lo mismo cuenta para C ++.

Si, por una loca coincidencia, desea convertir una cadena de caracteres en un entero, ¡también puede hacerlo!

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

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

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 en un largo , tratándolo como si fuera un número base base . Si ** endptr no es nulo, contiene el primer carácter que no sea dígito strtol () encontrado (pero a quién le importa eso).

Resta char '0' o int 48 así:

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

Explicación: Internamente funciona con valor ASCII . De la tabla ASCII, el valor decimal del carácter 5 es 53 y 0 es 48 . Entonces 53 - 48 = 5

O

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

Eso significa que si deduce 48 de cualquier carácter numérico, convertirá un entero automáticamente.

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

Para convertir el dígito de caracteres 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 carácter 8 es 56, el valor ASCII del carácter 0 es 48. El valor ASCII del entero 8 es 8.

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

int i = 56 - 48;   
i = 8;

Si solo 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 hará:

char *string = "24";

int value;

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

** no olvide verificar el estado (que debería ser 1 si funcionó en el caso anterior).

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

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<int>(c) ]; }

Este es básicamente el enfoque adoptado por muchas implementaciones de la biblioteca ctype. Puede adaptar esto trivialmente para que funcione también con dígitos hexadecimales.

Comprueba 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 <stdio.h>
#include <stdlib.h>

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

}

Si su dígito es, digamos, '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. Entonces solo debes hacer

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, utiliza la operación y en lugar de sub (como en las otras respuestas).

use la función: atoi para array a entero, atof para array a tipo flotante; o

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

Lo lanzarías a un int (o flotante o doble o lo que quieras hacer con él) y lo almacenarías en otra variable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top