Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: apoeti en 11 Agosto 2012, 16:23 pm



Título: Duda con punteros (error programa)
Publicado por: apoeti en 11 Agosto 2012, 16:23 pm
Hola, soy yo otra vez con un  problema con los ejercicios de "Aprendiendo C en 21 días". El problema en cuestión es que al ejecutar un programa me da un error. El susodicho programa es el siguiente:
Código:
#include <stdio.h>

int main()
{
    char *cadena;
    
    gets(cadena);
    while(*cadena!='\0')
        putchar(*cadena);
        cadena++;
}
El libro dice que el programa debe pasar carácter a carácter toda la cadena a la impresora con redirección. Como el tema de la redirección se puede hacer con el sistema operativo (creo que no me pide el ejercicio que lo haga con flujos), he decidido hacerlo así.
Como dije antes, me da error al ejecutarlo.
¿Alguien me puede decir por qué pasa esto?


Título: Re: Duda con punteros (error programa)
Publicado por: xiruko en 11 Agosto 2012, 16:44 pm
el principal error yo diria que es que estas declarando un puntero a char pero en ningun momento reservas memoria para el. ademas, te faltan los {} en el while ya que hay mas de una instruccion dentro de el. luego si dices que el main devuelve un int, te falta el return 0 al final (0, o lo que tu quieras, pero algo que signifique que ha acabado bien).

Código
  1. #include <stdio.h>
  2. #include <stdlib.h> //malloc()
  3. #include <string.h> //memset()
  4.  
  5. #define MAX 20
  6.  
  7. int main()
  8. {
  9.    char *cadena;
  10.  
  11.    cadena=(char*)malloc(MAX*sizeof(char));
  12.    memset(cadena, '\0', sizeof(cadena)); //inicializas a NULL toda la cadena
  13.    fgets(cadena, MAX-1, stdin);
  14.    while(*cadena!='\0') {
  15.        putchar(*cadena);
  16.        cadena++;
  17.    }
  18.    return 0;
  19. }

edito: por cierto, acosumbrate a usar fgets() en lugar de gets(), ya que con esta ultima no puedes limitar el numero de caracteres introducidos por el usuario y te puede dar problemas con overflows y demas.


Título: Re: Duda con punteros (error programa)
Publicado por: apoeti en 11 Agosto 2012, 16:50 pm
Gracias por la respuesta. Pero, una cosilla, yo pensaba que no hacía falta de forma obligatoria (aunque sí es recomendable) asignarle memoria a un puntero ¿Estaba equivocado y ha de hacerse siempre?

P.D: Respecto a lo de usar fgets(), siempre me dais el mismo consejo y pienso hacerlo en cuanto acabe el libro, descuida. Es más que nada por seguir el patrón que ofrece el libro y no perderme. :)

P.D. 2: Me he fijado en que todos los que me contestáis y ponéis código lo ponéis con colores, ¿cómo hacéis para pegarlo con los colores, o lo escribís aquí directamente?

Saludos.


Título: Re: Duda con punteros (error programa)
Publicado por: xiruko en 11 Agosto 2012, 16:57 pm
si que es cierto que no hay que reservarle memoria obligatoriamente a un puntero, pero si que hay que inicializarlo y decirle que apunte a algun sitio. hay 2 maneras para hacer esto:

1. reservar memoria como en el ejemplo anterior.
2. darle la direccion de alguna variable para que apunte a ella. como esa variable ya habia sido declarada, no tienes que declarar mas memoria. en el caso de strings, el mismo nombre de la cadena ya es un puntero al comienzo de la cadena. el ejemplo de antes hecho de esta manera podria ser asi:

Código
  1. #include <stdio.h>
  2.  
  3. #define MAX 20
  4.  
  5. int main()
  6. {
  7.    char *cadena, cadena2[MAX];
  8.  
  9.    cadena=cadena2;
  10.    fgets(cadena, MAX-1, stdin);
  11.    while(*cadena!='\0') {
  12.        putchar(*cadena);
  13.        cadena++;
  14.    }
  15.    return 0;
  16. }

edito: para poner el codigo con colores, selecciona las etiquetas GeSHi cuando escribas el mensaje. en este caso, serian asi [code = c][ / code] (sin ningun espacio en ellas, pero es que sino no aparece).


Título: Re: Duda con punteros (error programa)
Publicado por: apoeti en 11 Agosto 2012, 16:59 pm
Muchas gracias. Todo claro.  :D


Título: Re: Duda con punteros (error programa)
Publicado por: xiruko en 11 Agosto 2012, 17:00 pm
de nada!  ;D


Título: Re: Duda con punteros (error programa)
Publicado por: apoeti en 11 Agosto 2012, 17:02 pm
Te había enviado un privado para lo de los colores, pero veo que estuviste atento al hilo :)


Título: Re: Duda con punteros (error programa)
Publicado por: rir3760 en 12 Agosto 2012, 01:19 am
Hola, soy yo otra vez con un  problema con los ejercicios de "Aprendiendo C en 21 días".
Revisando de forma superficial ese libro tiene ciertos detalles (como el uso de "gets" y "scanf" en el capitulo sobre entrada y salida) que, honestamente, me parecen suficiente como para no recomendarlo a un principiante.

Una mejor opción es "The C programming Language", otro libro muy bueno pero disponible solo en ingles es "Pointers on C" de Kenneth Reek.

Un saludo