[C con Clase] lectura de caracteres y transformación a int.
Programante
programante en gmail.com
Mar Feb 27 22:54:00 CET 2007
Hola dani, yo diría que el problema está en que al estar al final, no va
seguido de un espacio. Por lo tanto no acaba. Prueba a cambiar
if (isspace(cad1[j])!=0){ //Si hay un espacio es que hemos alcanzado el final del nº.
por
if ((isspace(cad1[j])!=0) || (j == strlen(cad1)-1))){ //Espacio o final de cadena -> final del nº.
Eso debería bastar para que funcione.
Si nos vamos a asuntos de eficiencia, strlen() es de orden lineal. Podrías mejorarla sustituyendo la línea anterior por
if ((isspace(cad1[j])!=0) || (cad1[j+1])){
Y las comparaciones de los bucles i<strlen(cad1) // ji<strlen(cad1)
pueden cambiarse por cad1[i] // cad1[j] respectivamente.
Por otra parte, destinar espacio, copiar el número, para hacer atoi() es un tanto 'basto'. Además no veo que termines charaux con el caracter nulo, por lo que *es muy peligroso*.
Tienes los caracteres separados por espacios. Si haces atoi(cad1+i1), convertirá los números parándose en el espacio. No necesitas hacer nada más.
Si en tu caso esto no te sirve (consideras un número 'espacio' por ejemplo), entonces lo que o haría es:
cad1[j] = '\0'; //Aquí acaba la cadena
cad2[++elem2]=atoi(cad1+i1) //Leer
Estás sobreescribiendo los datos de cad1, pero puesto que es un buffer que está leyendo líneas y no vas a tener que tratar esa parte de nuevo, no importa (siempre y cuando ya no estés usando strlen() en los bucles).
Dos detalles más: cad1 es una *cad*ena C de caracteres. En cambio cad2 es un array de enteros. Los nombres pueden ser lo que quieras, pero estos llevan a pensar que cad2 es otra cadena. Cuidado no confundirte.
cad2[++elem2]=atoi(charaux); //Transformamos el char a int.
No estás convirtiendo un char en int, sino una serie de chars -que corresponden a dígitos- a int.
Espero que te sirva.
Un saludo.
Steven
Más información sobre la lista de distribución Cconclase