Autor
|
Tema: Duda sobre programa en C con STRINGS (Leído 2,695 veces)
|
elWartix
Desconectado
Mensajes: 6
|
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 //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(){ }
|
|
|
En línea
|
while(alive){ eat(); sleep(); code(); repeat(); }
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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.
|
|
|
En línea
|
|
|
|
elWartix
Desconectado
Mensajes: 6
|
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!
|
|
|
En línea
|
while(alive){ eat(); sleep(); code(); repeat(); }
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
justo después de la instrucción scanf.
|
|
|
En línea
|
|
|
|
elWartix
Desconectado
Mensajes: 6
|
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! void alta(){ char auxiliar [100]; fflush(stdin); printf("Introduce el nombre: \n"); fgets(auxiliar,100,stdin);
} Así queda finalmente. Muchas gracias de nuevo.
|
|
|
En línea
|
while(alive){ eat(); sleep(); code(); repeat(); }
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
No lo has entendido: Usar fflush(stdin); es una muy mala práctica.
|
|
|
En línea
|
|
|
|
elWartix
Desconectado
Mensajes: 6
|
Sí, he entendido que no es recomendado, pero es que en el propio ejercicio me piden que lo utilice.
|
|
|
En línea
|
while(alive){ eat(); sleep(); code(); repeat(); }
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda sobre modificar strings de VB compilado
Programación Visual Basic
|
katanaia
|
3
|
2,630
|
21 Octubre 2008, 01:13 am
por Spider-Net
|
|
|
Duda - Strings
Programación Visual Basic
|
h0oke
|
3
|
2,561
|
23 Septiembre 2009, 01:11 am
por W0lFy
|
|
|
Duda comparación de strings
.NET (C#, VB.NET, ASP)
|
BlaineMonkey
|
2
|
2,866
|
23 Febrero 2010, 10:29 am
por BlaineMonkey
|
|
|
Duda sobre manejo de strings en bash
Scripting
|
rastanthology
|
7
|
5,433
|
28 Septiembre 2010, 00:00 am
por rastanthology
|
|
|
Duda con strings y punteros
Programación C/C++
|
Ja_90
|
2
|
8,039
|
1 Noviembre 2014, 03:07 am
por Ja_90
|
|