[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