kleine datenbank
-
hallo ich habe mir gedacht ich bau mir mal eine kleine datenbank zum filme archivieren, also habe ich mir ein kleines geruest zu testzwecken geschrieben, wo ich allerdings auf probleme stoße...
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX 30 void output(); struct dvd *dvd_add(); struct dvd { int laenge; char name[MAX]; }; int main() { struct dvd *data[100]; int choice, i = 0; for(;;) { printf("\033[2J\033[1;1H"); printf("\nplease choose option\n" "----------------------------------\n" "1:\tadd dvd\n" "2:\tprint data (contains %d datas)\n" "3:\texit\n" "----------------------------------\n", i); scanf("%ld", &choice); switch(choice) { case 1: data[i++] = dvd_add(); break; case 2: printf("print data no <x>:\n"); scanf("%ld", &choice); output(data[choice]); break; case 3: return 0; default: printf("no menupoint found\n\n"); } } return 0; } struct dvd *dvd_add() { static struct dvd *ptr; ptr = (struct dvd *)malloc(sizeof(struct dvd)); printf("enter length of dvd\n"); do { scanf("%ld",&ptr->laenge); }while(getchar()!= '\n'); printf("enter name of dvd\n"); fgets(ptr->name, MAX, stdin); //kann nicht vor dem scanf //aufgerufen werden, da sonst return ptr; //uebersprungen } void output(struct dvd *out_p) { printf("----------------------------------------------------------\n"); printf("name..........%s", out_p->name); printf("length........%d minutes\n", out_p->laenge); printf("----------------------------------------------------------"); getchar(); //will an dieser stelle nicht }
ich habe mal den kompletten code gepostet da ich ueberhaupt nicht weiss wo ich fehler mache...
einmal kann ich einen string nicht vor einem integer wert einlesen und einmal bewirkt der aufrug der funktion getchar ueberhaupt nichts (im code durch kommentare gekennzeichnet).
weiss jemand rat?
-
@fgets():
Die Funktion liest maximal bis zum nächsten Newline im Eingabepuffer (und normale scanf()-Aufrufe lassen den Rest der Zeile im Puffer zurück, wenn sie alles wesentliche gefunden haben). Durch deine do-while()-Schleife vor dem fgets() räumst du den Puffer zufälligerweise auf (aber warte ab, was rauskommt, wenn du dort "123 " eingibst ;)), aber normalerweise müsstest du das vor der Abfrage erledigen.@getch():
Hier ist das selbe Problem - getch() holt das nächste Zeichen aus dem Eingabepuffer (und das ist in deinem Fall das Newline, das nach dem "scanf("%ld", &choice);" zurückgeblieben ist.Lösung für beide Probleme:
void fignore(FILE* f) { while((fgetc(f)!='\n') && !feof(f)); } ... fignore(stdin); fgets(ptr->name,MAX,stdin);
-
welche header braucht man fuer fignore()?
btw: existiert die funktion getch() noch in anderen headern als in conio.h ?
-
Moh schrieb:
welche header braucht man fuer fignore()?
den stdio.h, nicht mehr.
btw: existiert die funktion getch() noch in anderen headern als in conio.h ?
nein.
-
arghh, bloede frage welche header man braucht... hab das ganze wohl doch ein wenig sehr schnell ueberflogen...
danke fuer die hilfe