• Sábado 14 de Diciembre de 2024, 11:55

Autor Tema:  [c]puntero A Cadena De Caracteres  (Leído 4857 veces)

Conti

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
[c]puntero A Cadena De Caracteres
« en: Domingo 19 de Noviembre de 2006, 17:36 »
0
Saludos! :D
aunque sea mi primer post, no pretendo que me hagan el programa entero,tengo una duda concreta :).
Estoy haciendo un programita de inicio a C:
-Coger el nombre d eun fichero por linea de argumentos(solucionado)
-Leer lineas de caracteres(aqui estoy)
-Guardar en el fichero que he nombrado , las lineas leidas(si consigo el anterior,ya tengo este)

Os pongo el código que llevo:

Código: Text
  1.  
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6. #define MAXLINE 80
  7.  
  8. main(int argc, char *argv[]){
  9.   char* nombre_fichero=argv[1];
  10.  
  11.   char linea[MAXLINE];
  12.   char *lineas[10];
  13.  
  14.   int seguir=1;
  15.   int i=0;
  16.   int j=0;
  17.  
  18.   while(seguir){
  19.    
  20.    
  21.     lineas[i]=gets(linea);
  22.     if(linea[0]=='\0'){
  23.       seguir=0;
  24.     }
  25.     printf("%s\n",lineas[i]);
  26.      
  27.      
  28.     i++;
  29.   }printf("%s\n",lineas[0]);
  30.  
  31. }
  32.  
  33.  
  34.  
Me voy directo al while:
-guardo en la primera posicion del puntero la primera linea
-si empieza por nuelo, sale del while
-imprimo lo que he leido, guardaod en la posicion i del puntero
-aumento el contador i.

¿veis ese printf despues dle while?
Ahí es donde tengo el problema, imprime en blanco como si no se hubiese guardado nada en esa posicion.Es el mismo printf que esta dentro del while, pero estando fuera me imprime en blanco y estando dentro hace su función.
Me gustaría saber porqué sucede eso, si es psible, gracias.  :hola:

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: [c]puntero A Cadena De Caracteres
« Respuesta #1 en: Domingo 19 de Noviembre de 2006, 18:20 »
0
Con cada llamada a gets no estás creando una nueva cadena, sino que en lineas te estás quedando con punteros a la posición de memoria de la variable linea (la que utilizas como búfer de lectura), es decir, todos tus punteros guardados en lineas apuntan a linea y, en la última lectura, linea queda como una cadena vacía, todos tus punteros en lineas apuntan a ella por lo que al intentar imprimir cualquiera de las cadenas que creías almacenadas en líneas obtendrás basura (cadena vacía).

Saludos,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Conti

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: [c]puntero A Cadena De Caracteres
« Respuesta #2 en: Domingo 19 de Noviembre de 2006, 19:13 »
0
¿como podría solucionarlo?
Interpreto que con:
Código: Text
  1. char *lineas[10];
  2.  
Tengo diez punteros que apuntan a diez cadenas de carácteres, es asi?
linea[0] estaría apuntando a una posición de memoria distinta que linea[1] no?
Entonces si quiero guardar una cadena de texto en es aposición ,¿tendría que hacerlo con &linea? :ph34r:
Los punteros, mis grandes amigos  :rolleyes:

mamex

  • Miembro activo
  • **
  • Mensajes: 77
  • Nacionalidad: mx
    • Ver Perfil
Re: [c]puntero A Cadena De Caracteres
« Respuesta #3 en: Domingo 19 de Noviembre de 2006, 21:50 »
0
Prueba este codigo, a ver si te sirve. No usé apuntadores.

Código: Text
  1.  
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<stdlib.h>
  5. #include<string.h>
  6. #define MAXLINE 80
  7.  
  8. void main(int argc, char *argv[]){
  9.   char* nombre_fichero=argv[1];
  10.  
  11.   char lineas[10][MAXLINE];
  12.  
  13.   int seguir=1;
  14.   int i=0;
  15.   int j=0;
  16.  
  17.   do
  18.   { gets(lineas[i]);
  19.    if(lineas[i][0]!='\0')
  20.    {  printf("%s\n",lineas[i]);
  21.     i++;
  22.    }
  23.    else
  24.     seguir=0;
  25.   }while(seguir);
  26.   printf("%s\n",lineas[0]);
  27.  
  28. }
  29.  
  30.  

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: [c]puntero A Cadena De Caracteres
« Respuesta #4 en: Lunes 20 de Noviembre de 2006, 00:19 »
0
Cita de: "Conti"
¿como podría solucionarlo?
Interpreto que con:
Código: Text
  1. char *lineas[10];
  2.  
Tengo diez punteros que apuntan a diez cadenas de carácteres, es asi?
linea[0] estaría apuntando a una posición de memoria distinta que linea[1] no?
Entonces si quiero guardar una cadena de texto en es aposición ,¿tendría que hacerlo con &linea? :ph34r:
Los punteros, mis grandes amigos  :rolleyes:
Efectivamente, tienes diez punteros a char, pero no tienes reservada la memoria para cada una de esas cadenas, lo cual tendrías que hacer si quieres trabajar con punteros :P. El código de mamex debe funcionar bien, ahí puedes apreciar cómo ir guardando las cadenas en diferentes posiciones de memoria (y no en una sola como lo hacías en tu código).

Suerte,
JJ (Geo).
La imaginación es el límite.
Hardware & Software | Mexchip

Conti

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: [c]puntero A Cadena De Caracteres
« Respuesta #5 en: Jueves 23 de Noviembre de 2006, 16:58 »
0
Gracias mamex, al final con ese código me vale :).Un saludo.

[EDITADO]

saludos de nuevo, he estado enredando con el codigo para que lea directamente de teclado y me vaya escribiendo en un fichero,sin pasar por ninguna array ni historias  :alien:
Leer y escribir lo tengo superado, el problema viene cuando le meto la condicion para ver si existe el fichero y si lo quiero sobreescribir.Tal y como esta mi codigo, si digo "s" o "S", deberia permitirme escribir en el fichero,pero sale del programa automáticamente, no consigo ver el fallo :ph34r:  A ver si lo localizais vosotros , gracias  :lol:
Código: Text
  1.  
  2. #include<stdio.h>
  3.  
  4. #define MAXLINE 80
  5.  
  6.  
  7. main(int argc, char *argv[]){
  8.   char* fichero=argv[1];
  9.   char linea[MAXLINE];
  10.   int seguir=1;
  11.   int i=0;
  12.   char decision;
  13.  
  14.   //declaracion del fcihero
  15.   FILE *fp;
  16.   fp = fopen(fichero,"w");
  17.   if ( fp  != NULL){
  18.     printf("El fichero \"%s\" al que hace referencia ya existe\n",fichero);
  19.     printf("¿Desea sobreescribirlo?(S o s)(N o n)");
  20.     decision=getchar();
  21.     if(decision=='n' || decision=='N'){
  22.       exit(0);
  23.     }else{
  24.       while(seguir){
  25.         gets(linea);
  26.        
  27.         if(linea[0]=='\0'){
  28.           seguir=0;
  29.         }else{
  30.           fputs(linea,fp);
  31.           fputs("\n",fp);
  32.         }    
  33.         i++;
  34.       }
  35.  
  36.     }
  37.   }
  38.  
  39.   fclose(fp);
  40. }
  41.  
  42.