PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : getchar will nicht so, wie ich will



Gorgoroth
24-04-2005, 14:29
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

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 ;)


/* ----- 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?

aldialdi
24-04-2005, 15:34
schreib einfach:

while(getchar!="\n")


dann leert er den tastaturpuffer automatisch!

Gorgoroth
24-04-2005, 15:49
Danke für die Antwort erstmal.

Du meinst also:

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.

/* ----- 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;
}

panzi
24-04-2005, 16:04
#include <ctype.h>

/* ... */

do {
tipp = getchar();
} while( isspace( tipp ) );

isspace liefert 1 bei '\n', '\r', '\t', ' ' und '\v'.

Gorgoroth
24-04-2005, 16:23
danke panzi. funktioniert erstmal super.