Anzeige:
Ergebnis 1 bis 5 von 5

Thema: getchar will nicht so, wie ich will

  1. #1
    Registrierter Benutzer Avatar von Gorgoroth
    Registriert seit
    18.03.2005
    Beiträge
    7

    getchar will nicht so, wie ich will

    Hallo,

    ich versuche mich gerade in der Programmierung von einem Hangman-Spiel. Zur Zeit stehe ich vor dem Problem, in einer Variablen des Typs char den Tipp des Spielers zu speichern, welcher Buchstabe im gesuchten Wort vorkommt. Anscheinend ist hier irgendwo noch ein \n im stdin versteckt, dass mir die char-Variable automatisch überschreibt und dann bei
    Code:
    printf("Sie glauben also, dass %c im Wort vorkommt.\n", tipp);
    
    Sie glauben also, dass 
     im Wort vorkommt.
    ausgibt.

    Hier ist der Source von diesem preprepre-alpha-Hangman-spiel ;)

    Code:
    /* ----- Header-Files ----- */
    #include <stdio.h>
    #include <stdlib.h>
    // #include <curses.h>
    
    /* ----- Funktionsprototypen ----- */
    
    int main(void)
    {
    
    /* ratewort_eingeben-Anfang                     */
    /* Zweck: Speichert das Ratewort im String wort */
       char *wort,
            puffer[25+1];
    
       wort = malloc(strlen(puffer)+1);
       if (wort == NULL)
        {
           puts("Fehler bei der Speicherreservierung!");
           return 1;
        }
       puts("Geben Sie das zu erratende Wort ein.");
       scanf("%s", wort);
    
       system("clear");   /* hier noch eine if-Scheife machen, die prüft, welches OS verwendet wird, und dann */
                          /* halt den entsprechenden Code liefert. Das hier wird nur auf Unices funzen.       */
    
       printf("Das Wort war %s \n", wort);      /* ist nur zum Testen, ob das mit String auch geklappt hat. Mit  */
                                                /* steigendem C-Selbstbewusstsein, kann ich sowas dann weglassen */
    /* ratewort_eingeben-Ende */
    
    /* striche_ausgeben-Anfang */
    /* Zweck: Für jeden Buchstaben von wort einen Strich ausgeben */
       int x = 0,
           i;
       char strich = '-';
       x = (strlen(wort) - 1);
    
       for (i = 0 ; i <= x ; i++)
         {
            printf("%c", strich);
         }
       printf("\n");
    
    /* striche_ausgeben-Ende */
    
    /* tipp_speichern-Anfang */
    /* Zweck: speichert in einer Variablen einen buchstaben, den man im Wort vermutet */
    
       char tipp;
    
       puts("Geben sie bitte einen Buchstaben ein.");
       tipp = getchar();
    
       printf("Sie glauben also, dass %c im Wort vorkommt.\n", tipp);
    
    
    /* tipp_speichern-Ende */
    
       return 0;
    }
    P.S.: Was ist in diesem Forum eher erwünscht, Source-Code zu posten oder als Anhang mitzugeben?

  2. #2
    Registrierter Benutzer
    Registriert seit
    14.04.2005
    Beiträge
    14
    schreib einfach:

    while(getchar!="\n")


    dann leert er den tastaturpuffer automatisch!

  3. #3
    Registrierter Benutzer Avatar von Gorgoroth
    Registriert seit
    18.03.2005
    Beiträge
    7
    Danke für die Antwort erstmal.

    Du meinst also:
    Code:
    char tipp;
     
       puts("Geben sie bitte einen Buchstaben ein.");
       while(getchar!="\n")
            tipp = getchar();
       printf("Sie glauben also, dass %c im Wort vorkommt.\n", tipp);
    Wenn ja, dann gibt er "Geben sie bitte einen Buchstaben ein." aus.
    ich gebe z.B. a <ENTER> ein
    er springt in die nächste Zeile.
    ich kann wieder was eingeben
    er springt wieder in die nächste Zeile usw.

    Der veränderte Source sieht dann so aus.
    Code:
    /* ----- Header-Files ----- */
    #include <stdio.h>
    #include <stdlib.h>
    // #include <curses.h>
    
    /* ----- Funktionsprototypen ----- */
    
    int main(void)
    {
    
    /* ratewort_eingeben-Anfang                     */
    /* Zweck: Speichert das Ratewort im String wort */
       char *wort,
            puffer[25+1];
    
       wort = malloc(strlen(puffer)+1);
       if (wort == NULL)
        {
           puts("Fehler bei der Speicherreservierung!");
           return 1;
        }
       puts("Geben Sie das zu erratende Wort ein.");
       scanf("%s", wort);
    
       system("clear");   /* hier noch eine if-Scheife machen, die prüft, welches OS verwendet wird, und dann */
                          /* halt den entsprechenden Code liefert. Das hier wird nur auf Unices funzen.       */
    
       printf("Sie haben %s eingegeben.\n", wort);  /* ist nur zum Testen, ob das mit String auch geklappt hat. Mit  */
                                                    /* steigendem C-Selbstbewusstsein, kann ich sowas dann weglassen */
    /* ratewort_eingeben-Ende */
    
    /* striche_ausgeben-Anfang */
    /* Zweck: Für jeden Buchstaben von wort einen Strich ausgeben */
       int x = 0,
           i;
       char strich = '-';
       x = (strlen(wort) - 1);
    
       for (i = 0 ; i <= x ; i++)
         {
            printf("%c", strich);
         }
       printf("\n");
    
    /* striche_ausgeben-Ende */
    
    /* tipp_speichern-Anfang */
    /* Zweck: speichert in einer Variablen einen buchstaben, den man im Wort vermutet */
    
       char tipp;
    
       puts("Geben sie bitte einen Buchstaben ein.");
    
       while(getchar!="\n")
             tipp = getchar();
    
       printf("Sie glauben also, dass %c im Wort vorkommt.\n", tipp);
    
    
    
    /*   puts("Geben sie bitte einen Buchstaben ein.");
       tipp = getchar();
    
       printf("Sie glauben also, dass %c im Wort vorkommt.\n", tipp); */
    
    
    /* tipp_speichern-Ende */
    
    /* tipp_vergleichen-Anfang */
    /* Zweck: durchläuft den String wort und überprüft, ob tipp darin vorkommt. */
    
       int cnt_tipp_vergl = 0,
           fehler = 0;
    
       for (cnt_tipp_vergl = 0; cnt_tipp_vergl <= x; cnt_tipp_vergl++)
         {
            if (wort[cnt_tipp_vergl] == tipp)
                    printf("Der Buchstabe %c kommt an der %d. Stelle im Wort vor.\n", tipp, cnt_tipp_vergl+1);
            else
                {
                    fehler++;
                    switch (fehler)
                    {
                        case 1:
                        system("clear");
                        puts("          ");
                        puts("          ");
                        puts("          ");
                        puts("          ");
                        puts("          ");
                        puts(" ________ ");
                        puts("|XXXXXXXX|");
                        puts("´´´´´´´´´");
                        break;
    
                        case 2:
                        puts("          ");
                        puts("|         ");
                        puts("|         ");
                        puts("|         ");
                        puts("|         ");
                        puts("|________ ");
                        puts("|XXXXXXXX|");
                        puts("´´´´´´´´´");
                        system("clear");
                        break;
    
                        case 3:
                        puts("_____");
                        puts("|/   |");
                        puts("|    O");
                        puts("|     ");
                        puts("|     ");
                        puts("|________");
                        puts("|XXXXXXXX|");
                        puts("´´´´´´´´´");
                        system("clear");
                        break;
    
                        case 4:
                        puts("_____");
                        puts("|/   |");
                        puts("|    O");
                        puts("|   /|\\");
                        puts("|       ");
                        puts("|________");
                        puts("|XXXXXXXX|");
                        puts("´´´´´´´´´");
                        system("clear");
                        break;
    
                        case 5:
                        puts("_____");
                        puts("|/   |");
                        puts("|    O");
                        puts("|   /|\\");
                        puts("|   / \\");
                        puts("|________");
                        puts("|XXXXXXXX|");
                        puts("´´´´´´´´´");
                        break;
                     }
                    printf("Der Buchstabe %c kommt im Wort nicht vor. Sie haben noch %d Versuche offen.\n", tipp, 5-fehler);
                    break;
                }
         }
    /* tipp_vergleichen-Ende */
    
    
       return 0;
    }

  4. #4
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Code:
    #include <ctype.h>
    
    /* ... */
    
    do {
       tipp = getchar();
    } while( isspace( tipp ) );
    isspace liefert 1 bei '\n', '\r', '\t', ' ' und '\v'.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  5. #5
    Registrierter Benutzer Avatar von Gorgoroth
    Registriert seit
    18.03.2005
    Beiträge
    7
    danke panzi. funktioniert erstmal super.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •