Duda con punteros (error programa)

Iniciado por apoeti, 11 Agosto 2012, 16:23 PM

0 Miembros y 1 Visitante están viendo este tema.

apoeti

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:
#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?

xiruko

#1
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).


#include <stdio.h>
#include <stdlib.h> //malloc()
#include <string.h> //memset()

#define MAX 20

int main()
{
   char *cadena;
   
   cadena=(char*)malloc(MAX*sizeof(char));
   memset(cadena, '\0', sizeof(cadena)); //inicializas a NULL toda la cadena
   fgets(cadena, MAX-1, stdin);
   while(*cadena!='\0') {
       putchar(*cadena);
       cadena++;
   }
   return 0;
}


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.

apoeti

#2
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.

xiruko

#3
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:

#include <stdio.h>

#define MAX 20

int main()
{
   char *cadena, cadena2[MAX];

   cadena=cadena2;
   fgets(cadena, MAX-1, stdin);
   while(*cadena!='\0') {
       putchar(*cadena);
       cadena++;
   }
   return 0;
}


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).

apoeti


xiruko


apoeti

Te había enviado un privado para lo de los colores, pero veo que estuviste atento al hilo :)

rir3760

Cita de: apoeti en 11 Agosto 2012, 16:23 PMHola, 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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language