C/Visual C - Soy Novato. HELP

 
Vista:

Soy Novato. HELP

Publicado por Javier (2 intervenciones) el 19/08/2003 20:31:18
Hola a todos. Soy nuevo en esto del C y me gustaría que alguien me mirase este programa para ver cual es el error que tengo:

// Compilo con DEV C++ 4.9.8.0
#include <stdio.h>
// ¿Por qué en DEV C++ no puedo poner conio.h?
#include <conio.c>
int main(int argc, char *argv)
{
// Defino un puntero
char *n;
printf("Escribe una cadena de texto");
printf("\n\n >> ");
// Utilizo el comando fflush y gets para insertar texto
fflush(stdin);
gets(n);
// Ahora borro la pantalla para sacar los datos
clrscr();
printf("El texto es: %s", n);
getch();
return 0;
}

El problema es que si inserto cadenas de texto, a la cuarta me cambia de color el fondo de pantalla: hola hola hola hola = FONDO CAMBIADO A VERDE.
¿Por qué me cambia el color de fondo?. Utilizo winxp.
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Soy Novato. HELP

Publicado por chuidiang (677 intervenciones) el 20/08/2003 12:43:32
La funcion gets() requiere que le pases una "zona de memoria" donde dejar los datos que lee del teclado.
Esa zona de memoria se pasa con un puntero char * que apunte a dicha zona.
Tu declaras char *n, pero no lo haces apuntar a una zona de memoria, sino que lo dejas apuntando al azar. El comportamiento de eso es indeterminado, puede pasar cualquier cosa. Se leen los datos y se escriben en cualquier sitio de la memoria.

Para hacerlo correctamente, puedes hacer esto

char n[100];
...
gets (n);

El array es una zona de memoria de 100 caracteres y n se comporta como un puntero que apunta al inicio de esa zona. Esto te dejara leer sin problemas hasta 99 caracteres del teclado. El caracter 100 queda reservado para el \0 que se mete al final. Si metes mas de 99 caracteres estamos como antes, asi que pon un tamaño lo suficientemente grande como para asegurar que no vas a escribir mas.

Una forma mas correcta es utilizar fgets() en vez de gets()

fgets (n, 100, stdin);

funciona igual, le pasas n, le pasas el tamaño de la zona de memoria (100) y de donde quieres leer (stdin es el teclado). Esta funcion se asegura entonces de no pasarse de los 100 caracteres.

Se bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar