Hilfe, meine verkettete Liste spinnt...

Wallnussfolie

Grünschnabel
Hallo liebe Programmierfreunde,

ich bin gerade dabei, ein Wörterbuch mittels einer verketteten Liste zu Programmieren. Nun bin ich auf ein kleines Problem gestoßen, was mich gerade an den Rand der Verzweiflung bringt.

In der Funktion eintrag_einfuegen() umgeht mein Programm einfach beide fgets()-Aufrufe, es schreibt einfach nur die Ausgaben der beiden printf's untereinander und warte dann auf eine Eingabe, wenn ich dann etwas eingegeben habe, verlässt es die Funktion und geht in den do-while Loop zurück. Ich komme einfach nicht dahinter, wieso es die fgets()-Aufrufe ignoriert ? Könnt ihr den Fehler sehen ?

Hier der Quellcode:
C++:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Funktionsprototypen */

void eintrag_einfuegen(void);
void eintrag_loeschen(void);
void inhalt_ausgeben(void);

typedef struct EINTRAG {
  char  Deutsch[128];
  char Englisch[128];
  struct EINTRAG* next_element;
}eintrag;

eintrag* head;
eintrag* neu;
eintrag* aktuell;

int main(int argc, char *argv[])

{
int antwort;
head=NULL;
printf("Willkommen zu meinem Wörterbuch!\n");
do
{
 
      printf("Was möchten sie tun?\n");
      printf("1:Einen Eintrag am Ende einfügen\n");
      printf("2:Einen Eintrag löschen\n");
      printf("3:Den Inhalt der verketteten Liste ausgeben\n");
      printf("4:Das Programm beenden\n");
      puts("----------------------------------------------------");
      scanf("%d",&antwort);
      switch(antwort)
      {
        case 1: { eintrag_einfuegen();      break; }
        case 2: { eintrag_loeschen();       break; }
        case 3: { inhalt_ausgeben();     break; }
        case 4: { exit(0);         break; }
        default: { printf("Keine gültige Eingabe, das Programm beendet sich!\n"); exit(-1);  break; }
      }
} while (1);
return 0;
}


void eintrag_einfuegen(void)
{
  if (head==NULL)
  {
     neu=malloc(sizeof(eintrag));
     printf("Geben Sie das englische Wort ein!\n");
     fgets(neu->Englisch,128,stdin);
     printf("Geben Sie das deutsche Wort ein!\n");
     fgets(neu->Deutsch,128,stdin);
     neu->next_element=NULL;
     head=neu;
     free(neu);
  }
  else
  {
     puts("PLATZHALTER");
  }

}

void eintrag_loeschen(void)
{

}

void inhalt_ausgeben(void)
{

}

Vielen Dank im Voraus für eure Hilfe !

Hinweise: Ich kompiliere mit gcc, CPU: Intel Core i5-3230M, Kubuntu 64 Bit

PS: sorry für den Schreibfehler in der Themenüberschrift, kann man das noch irgendwie korrigieren ?
 
Zuletzt bearbeitet:
Bei deinem scanf() in main() gibts du eine Zahl ein und drückst anschließend auf ENTER. Beides landet somit im Eingabepuffer. Die Zahl wird durch scanf() in antwort abgespeichert, das ENTER bleibt jedoch im Puffer. Das erste fgets() wartet nur auf eine Eingabe, wenn der Eingabepuffer leer ist. In deine Fall ist aber noch das ENTER im Puffer und das wird vom fgets() ausgelesen und in neu->Englisch abgespeichert. Das zweite fgets() läuft ganz normal.

Um das Problem fürs erste zu beheben, reicht es, nach scanf() ein getchar() einzubauen, welches das ENTER, das noch im Puffer ist, ausliest.

Speziell wenn du später dann einmal fehlerhafte Eingaben (beispielsweise Buchstaben) abfangen möchtest, wird aber auch mit dieser Methode nicht immer alles funktionieren. Dieses Problem ist jedoch bekannt und es gibt mehrere Lösungen dazu, je nachdem was die Situation verlangt. Einfach mal bei google eingeben! :)

Lg
 
Vielen Dank ibafluss für deine ausführliche und sehr schnelle Antwort. Ich hätte das eigentlich wissen müssen, das Problem hatte ich schonmal in ähnlicher Form. Dann kann ich jetzt endlich weitermachen :D Danke nochmal !
 
Zurück