Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: elWartix en 8 Marzo 2016, 20:46 pm



Título: Duda sobre programa en C con STRINGS
Publicado por: elWartix en 8 Marzo 2016, 20:46 pm
Buenas tengo un problema.

estoy haciendo el siguiente programa y al llegar a la funcion alta no me funciona fgets para coger el string y luego poder pasarlo a un string dinamico, utilizo fgets y no gets para que si se escribe mas de la capacidad del string que no se sobrescriban datos.

Os dejo aquí el código a  ver si podeis ayudarme, está sin acabar, pero ya tengo ese problema. Gracias

Código:
//Proyecto Agenda.

#include <stdio.h>
#include <stdlib.h> //Por si utilizamos memoria dinamica para que sea mais rapido/eficiente
#include <string.h>

typedef struct{
char *nombre; //memoria dinamica para ahorrar espacio
int numero;


}datos;



void alta();
void baja();
void consultar();


int main(){

char aux[100];
int selector;

do{
printf("==========================");
printf("           MENU          ");
printf("==========================");
printf("\n");
printf("\n");
printf("Eliga una de las siguientes opciones: ");
printf("\n");
printf("\n");
printf("1- Dar de alta un contacto\n");
printf("2- Dar de baja un contacto\n");
printf("3- Consultar contactos\n");

fflush(stdin);      //limpiamos buffer por si se introduce una frase para que no se cree un bucle infinito
scanf("%i",&selector);


system("cls");  //borrar pantalla

}while(selector < 1 || selector > 3);


switch(selector){

case 1:   alta();               break;
case 2:   baja();             break;
case 3:   consultar();      break;

default: printf("ERROR"); //No es necesario este default.
}


system("pause");
return 0;
}

void alta(){

char auxiliar [100];
printf("Introduce el nombre: \n");
fgets(auxiliar,100,stdin);


}

void baja(){


}

void consultar(){


}


Título: Re: Duda sobre programa en C con STRINGS
Publicado por: MAFUS en 8 Marzo 2016, 20:58 pm
En alta(), auxiliar es una variable local y cuando se salga del ámbito de la función la información contenida va a desaparecer.

De todas formas deberías guardarlo en nombre de una variable de tipo struct dato. Recuerda que para hacer eso primero debes asignar espacio en la memoria con malloc o calloc para el puntero a char nombre. De igual forma deberás tener en cuenta que la memoria que dejes de usar de un tipo dato tendrás que liberar el puntero nombre con free antes de borrar el dato.

Supongo también que te interesará hacer una lista de datos por lo que tendrás que implementarla, pero eso más adelante.


Título: Re: Duda sobre programa en C con STRINGS
Publicado por: elWartix en 8 Marzo 2016, 21:32 pm
Entiendo, lo que quiero hacer con auxiliar es guardar la frase temporalmente para luego medir la longitud de la frase y asignar la memoria con malloc en funcion de la longitud y asi no desperdiciar memoria, pero mi problema es que cuando inicio el programa y llego a la funcion alta, no me deja introducir una frase a auxiliar con fgets sino que en vez de pararse para poder escribir el programa continua, y no tengo ni idea de porque. Muchas gracias! :)


Título: Re: Duda sobre programa en C con STRINGS
Publicado por: MAFUS en 8 Marzo 2016, 22:17 pm
Entiendo.
Hoy mismo ha habido una consulta en el foro con tu mismo problema.
Y repito:
fflush(stdin); no sirve para todos los compiladores, el estándar no define un comportamiento; por tanto solo se debe usar fflush para streams de salida.

Después de un scanf queda el caracter '\n' en el buffer del teclado que será recogido en la próxima lectura. Para evitarlo usar la instrucción
Código
  1. while(getchar() != '\n');
justo después de la instrucción scanf.


Título: Re: Duda sobre programa en C con STRINGS
Publicado por: elWartix en 9 Marzo 2016, 16:37 pm
Muchas gracias, has sacado el tema del fflush(stdin) y me he dado cuenta de que me faltaba para vaciar el buffer antes de pedir que se introduzca la string por teclado. La he puesto y ya me funciona. MUCHISIMAS GRACIAS!

Código:
void alta(){
char auxiliar [100];

fflush(stdin);
printf("Introduce el nombre: \n");
fgets(auxiliar,100,stdin);


}

Así queda finalmente. Muchas gracias de nuevo.


Título: Re: Duda sobre programa en C con STRINGS
Publicado por: MAFUS en 9 Marzo 2016, 21:01 pm
No lo has entendido:
Usar fflush(stdin); es una muy mala práctica.


Título: Re: Duda sobre programa en C con STRINGS
Publicado por: elWartix en 9 Marzo 2016, 21:51 pm
Sí, he entendido que no es recomendado, pero es que en el propio ejercicio me piden que lo utilice.


Título: Re: Duda sobre programa en C con STRINGS
Publicado por: MAFUS en 10 Marzo 2016, 09:31 am
Ah, ok, entonces sí  :rolleyes: