Autor
|
Tema: Duda con punteros (error programa) (Leído 3,608 veces)
|
apoeti
Desconectado
Mensajes: 81
|
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?
|
|
« Última modificación: 11 Agosto 2012, 17:05 pm por apoeti »
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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') { 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.
|
|
« Última modificación: 11 Agosto 2012, 16:45 pm por xiruko »
|
En línea
|
|
|
|
apoeti
Desconectado
Mensajes: 81
|
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.
|
|
« Última modificación: 11 Agosto 2012, 16:57 pm por apoeti »
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
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') { 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).
|
|
« Última modificación: 11 Agosto 2012, 16:59 pm por xiruko »
|
En línea
|
|
|
|
apoeti
Desconectado
Mensajes: 81
|
Muchas gracias. Todo claro.
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
de nada!
|
|
|
En línea
|
|
|
|
apoeti
Desconectado
Mensajes: 81
|
Te había enviado un privado para lo de los colores, pero veo que estuviste atento al hilo
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
duda sobre punteros
Ejercicios
|
maryrisas
|
1
|
4,133
|
23 Febrero 2006, 17:59 pm
por [[JONAS]]
|
|
|
[C] - Duda punteros
Programación C/C++
|
h0oke
|
2
|
2,623
|
23 Mayo 2010, 02:19 am
por h0oke
|
|
|
Errores con programa (punteros)
Programación C/C++
|
jamatbar
|
0
|
1,541
|
10 Diciembre 2011, 18:59 pm
por jamatbar
|
|
|
Duda con punteros
Programación C/C++
|
cazagavilan
|
5
|
3,262
|
14 Abril 2012, 05:47 am
por cazagavilan
|
|
|
Error en programa de punteros
Programación C/C++
|
Error 404:
|
7
|
2,993
|
24 Mayo 2013, 11:24 am
por leosansan
|
|