2009-11-26 34 views
8

¿Cómo puedo convertir char a [0] en int b [0] donde b es un vacío int matriz asignada dinámicamenteConvertir single-char a int

He tratado

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

Quiero 4, pero me da valor ASCII 52

también haciendo

a[0] = aoti(temp); 

me da error: co no válido nVersión de ‘carbón’ a ‘const char *’ inicializar el argumento 1 de ‘atoi int (const char *)’

+0

Tenga en cuenta que atoi no funciona porque toma atoi en una cadena y no en un solo carácter, ¡por la muy buena razón de que la mayoría de los números tienen más de un dígito! –

Respuesta

24

Que tiene que hacer:

int temp2 = temp - '0'; 

lugar.

+0

Desde el punto de vista de un abogado de lenguaje, me imagino que no es válido suponer que los dígitos sean secuenciales, por lo que puede no ser 100% portátil, aunque funciona tanto en ASCII (y sus extensiones) como en EBCDIC, así que en la práctica es multa. –

+13

Sorprendentemente, está perfectamente bien incluso para un abogado de idiomas: ISO C90 contiene el siguiente requisito: "En los juegos de caracteres básicos de origen y ejecución, el valor de cada carácter después de 0 en la lista de dígitos decimales anterior será uno mayor que el valor de la anterior ". –

+0

Muy bien, @Pavel. Hay una gran cantidad de código escrito suponiendo que los alfas también son contiguos, lo que lo convierte en un PITA real para el acceso al subsistema UNIX del mainframe (USS, que usa EBCDIC, que no debe confundirse con zLinux que usa ASCII). Aparte del limitado conjunto de caracteres mínimo y la naturaleza contigua de los caracteres numéricos, ISO C realmente no exige mucho en esa área. – paxdiablo

1

La versión atoi() no funciona porque atoi() funciona en cadenas, no en caracteres individuales. Así que esto funcionaría:

char a[] = "4"; 
b[0] = atoi(a); 

Tenga en cuenta que puede estar tentado a hacer: atoi (& temp) pero esto no funcionaría, ya que & temperatura no apunta a una cadena terminada en cero.

0

Puede reemplazar toda la secuencia:

char a[] = "4x^0"; 
int *b; 
b = new int[10]; 
char temp = a[0]; 
int temp2 = temp - 0; 
b[0] = temp2; 

con el más simple:

char a[] = "4x^0"; 
int b = new int[10]; 
b[0] = a[0] - '0'; 

No hay necesidad en absoluto a enredar con variables temporales. La razón es necesario utilizar '0' en lugar de 0 es porque el primero es el carácter '0', que tiene un valor de 48, en lugar del valor 0.