Convierta un dígito de carácter al entero correspondiente en C
-
07-07-2019 - |
Pregunta
¿Hay alguna forma de convertir un carácter en un entero en C?
Por ejemplo, de '5'
a 5?
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.