Respuestas:
Según otras respuestas, esto está bien:
char c = '5';
int x = c - '0';
Además, para la verificació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 con 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' sean contiguos, pero no ofrece garantías para otros caracteres como letras del alfabeto.
Reste '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/3del borrador C99 ). Lo mismo cuenta para C ++.
Si, por alguna loca coincidencia, desea convertir una cadena de caracteres en un número entero, ¡también puede hacerlo!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
valahora es 1024. Aparentemente atoi()está bien, y lo que dije antes solo se aplica a mí (en OS X (tal vez (inserte aquí la broma de Lisp))). Escuché 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);
Se convierte en *stra long, tratándolo como si fuera un basenúmero base . Si **endptrno es nulo, contiene el primer carácter que no es un dígito strtol()encontrado (pero a quién le importa eso).
itoa_s().
Reste 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á el número entero automáticamente.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'ya es de tipo int, por lo que no necesita el yeso. Incluso si no fuera así, el yeso no es necesario.
Para convertir el dígito de carácter 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 caracteres.
int i = 56 - 48;
i = 8;
Si es solo un solo carácter 0-9 en ASCII, entonces 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á suficiente:
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).
Pablo.
Cuando necesito hacer algo como esto, horneo previamente 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.
Solo usa la atol()función:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Si su dígito está, digamos, '5'en ASCII, se representa como el número binario 0011 0101(53). Cada dígito tiene los cuatro bits más altos 0011y 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 andoperación en lugar de sub(como en las otras respuestas).
'5'es 53 ( 00110101)
Aquí hay funciones auxiliares que permiten convertir dígitos en char a int y viceversa:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
función de uso: atoi para matriz a entero, atof para matriz a tipo flotante; o
char c = '5';
int b = c - 48;
printf("%d", b);