2009-03-10 7 views

Respuesta

69

Como por otras respuestas, esto está muy bien:

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

Además, para la comprobación de errores, es posible que desee comprobar isdigit (c) es verdadera en primer lugar. Tenga en cuenta que no se puede completamente portable hacer lo mismo para las letras, por ejemplo:

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

Las garantías estándar que los valores CHAR para los dígitos del '0' al '9' son contiguas, pero no ofrece ninguna garantía de otros personajes como Letras del abecedario.

+0

¿Esto funcionará con EBCDIC u otras codificaciones que no sean ASCII? –

+2

@Paul Tomblin: Sí para dígitos, no letras, porque, como dije en la respuesta, las garantías estándar '0' a '9' son contiguas, pero no hacen tales garantías para otros caracteres, como 'a' a 'z' . – Chris

+0

char c = 'b'; int x = c - 'a'; entonces x será 1 solo en ASCII? – Pan

26

Reste '0' como esto:

int i = c - '0'; 

El C estándar garantiza 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 la C99 draft). Lo mismo cuenta para C++.

+1

Esta respuesta sería mejor si usted ha mencionado que es un char/ya/eficacia un número entero, aunque situado signo de aplicación definido (es decir, podrían ser con o sin signo), y es CHAR_BITS larga. – Arafangion

+0

no estaba seguro de saber que realmente lo ayuda. pero Chris hizo un buen punto con un ... no siendo necesariamente contiguo. debería haber mencionado eso en su lugar. ahora ganó la carrera :) –

+0

El tuyo es mejor porque calificaste tu respuesta, sin embargo, Chris podría haber inventado sus cosas. :) – Arafangion

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

'numeralChar - '0'' ya es de tipo' int', por lo que no No necesitas el elenco. Incluso si no fuera así, el yeso no es necesario. –

+0

Huh, sí, eso forzaría, ¿no? Tal vez Java ha coloreado mis percepciones. O tal vez estoy completamente equivocado e incluso forzaría en Java. :) –

-3

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.

+3

Tal vez no debería haber respondido a este ... – SeanJA

-1

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

Si desea convertir un mayor número a continuación, la siguiente lo hará:

char *string = "24"; 

int value; 

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

** no se olvide de comprobar el estado (que debe ser 1 si ha funcionado en el caso anterior).

Paul.

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

Si, por alguna coincidencia loco, desea convertir una cadena de caracteres a un entero, se puede hacer eso también!

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

val es ahora 1024. Al parecer atoi() está muy bien, y lo que dije de que antes sólo se aplica a mí (en OS X (tal vez (inserte aquí broma Lisp))). He oído que es una macro que se asigna más o menos al siguiente ejemplo, que utiliza strtol(), una función más de uso 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 a long, tratándolo como si fuera un número de base base. Si **endptr no es nulo, contiene el primer carácter no dígito strtol() encontrado (pero a quién le importa eso).

+0

No hay problemas de subprocesos con atoi (no tiene datos estáticos) y no está en desuso. De hecho, es funcionalmente equivalente a: #define atoi (x) (int) (strtol ((x), NULL, 10) –

+0

Bueno, maldición. Mis páginas de manual son antiguas. –

+4

El problema con atoi es que usa 0 como un " no puede encontrar un número aquí "value", entonces atoi ("0") y atoi ("one") devuelven 0. Si eso no funciona para lo que lo está usando, busque strtol() o sscanf(). –

0

Cuando tengo que 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, .... }; 

A continuación, 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. También puede adaptar esto de manera trivial para trabajar con dígitos hexadecimales.

+0

Parece extremadamente ineficiente para convertir un solo dígito decimal (u octal). la parte relevante de su tabla de búsqueda no está en la memoria caché L1, explotará un montón de ciclos para obtener un valor. Francamente, tiendo a dudar de que sea una buena idea si volver a convertir una gran cantidad de dígitos, pero tendrías que medir eso. Es mucho más competitivo para hex, por supuesto. – dfeuer

0

comprobar esto,

char s='A'; 

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

por sólo 0,1,2, ...., E, F.

4

Reste Char '0' o INT 48 como esto:

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

O

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

función de uso: atoi para array a entero, atof para array flotar tipo; o

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

Varias respuestas ya cubrieron esto. Esto no agrega nada que ya no hayan cubierto. – ShadowRanger

0

sólo tiene que utilizar la función atol():

#include <stdio.h> 
#include <stdlib.h> 

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

} 
0

Convertir dígitos personaje entero correspondiente. Haga lo siguiente:

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 caracteres ASCII.

int i = 56 - 48; 
i = 8; 
Cuestiones relacionadas