C - fgets wird einmal übersprungen

  • C - fgets wird einmal übersprungen

    Hi,

    ich habe folgendes kleine C Programm:

    C-Quellcode

    1. #include <stdio.h>
    2. #include <strings.h>
    3. //Fakultätsfunktionsdeklaration
    4. int factorial(int i) {
    5. //Fakult√§t initialisieren
    6. int factorial = 1;
    7. //Nur berechnen wenn index gr√sser als 1, da !1 = 1 und !0 = 1
    8. while (i > 1) {
    9. //Fakultät erhöhren und index um eins verringern
    10. factorial *= i--;
    11. }
    12. return factorial;
    13. }
    14. int main(void) {
    15. char choice;
    16. char input[2] = {0};
    17. printf("Dieses Programm berechnet die Fakultäten von 1 bis 10 und gibt sie aus.\n");
    18. do {
    19. printf("Wollen Sie fortfahren? (y/n)\n");
    20. //Benutzereingabe einlesen
    21. fgets(input, sizeof(input), stdin);
    22. sscanf(input, "%c", &choice);
    23. //Der Nutzer möchste fortfahren
    24. if (choice == 'y') {
    25. //Array of factorials
    26. int factorials[10];
    27. //Anzahl der Einträge dynamisch berechnen
    28. int numberOfElements = sizeof(factorials) / sizeof(factorials[0]);
    29. //Array durchlaufen
    30. for (int i = 0; i < numberOfElements; i++) {
    31. //Fakultät berechnen und entsprechendem Feld zuweisen
    32. factorials[i] = factorial((i + 1));
    33. }
    34. //Einträge durchlaufen
    35. for (int i = 0; i < numberOfElements; i++) {
    36. //Index is the Zahl und das Element des Array the Fakultät zu der Zahl
    37. printf("Die Fakultät der Zahl %d ist %d\n", (i + 1), factorials[i]);
    38. }
    39. } else if (choice != 'y' && choice != 'n') {
    40. printf("Bitte tätigen Sie eine gültige Eingabe.\n");
    41. choice = '\0';
    42. memset(input, 0, sizeof(input));
    43. }
    44. } while (choice != 'y' && choice != 'n');
    45. printf("Das Programm wird beendet. Auf Wiedersehen!\n");
    46. return 0;
    47. }
    Alles anzeigen


    Wenn ich das Programm ausführe und etwas eingebe, das ungleich "y" oder "n" ist, dann macht das Programm das:

    Quellcode

    1. Dieses Programm berechnet die Fakultäten von 1 bis 10 und gibt sie aus.
    2. Wollen Sie fortfahren? (yes/no)
    3. h
    4. Bitte tätigen Sie eine gültige Eingabe.
    5. Wollen Sie fortfahren? (yes/no)
    6. Bitte tätigen Sie eine gültige Eingabe.
    7. Wollen Sie fortfahren? (yes/no)


    Warum? Ich bin schon mit dem Debugger durchgesteppt, konnte den Fehler aber nicht ausfindig machen. Ich verstehe nicht, warum fgets einfach einmal übergangen wird.
    Weiß jemand Rat?
  • Das Konstrukt mit fgets() und sscanf() sieht komisch aus und funktioniert wohl nicht wie gewollt! Des weiteren ist das else if so nicht gut...

    Jedenfalls wenn Du das Input-Array größer anlegst, dann hat auch fgets() genug Raum um eine Zeile einzulesen. Um das erste Zeichen zu bekommen, brauchst Du nicht unbedingt sscanf().

    Mit dem Debugger hätte dir auffallen können, dass choice die Werte durchgeht, die Du eingegeben hast. Also wenn Du ein Zeichen + Enter eintippst, dann nimmt choice ein Zeichen + Enter an. Wenn Du mehr Zeichen + Enter eintippst, dann halt mehr Zeichen und zum Schluss Enter.
  • Hm,

    durch den sizeof() wartet fgets nicht auf ein Return sondern auf die Eingabe von 2 Zeichen (sizeof(Input)==3-1). Du kannst also z.B. 'y' + 'Return' eingeben oder aber auch 'fg' und es wird der fgets verlassen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)