PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : printf asgabe wirde zweimal angezeigt



doomcalyptica
09-11-2004, 14:28
hallo,
was das programm macht ist glaub ich erstmal nicht so wichtig:


#include <stdio.h>

int main(){
short sternchen=0;
int versuche=10;
int anzahl=(sizeof(char)*256);
char zeichen='h';
char suche[255];
char loese[255];

printf("dein wort\n");
scanf("%s",suche);

for(anzahl=0; suche[anzahl]!='\0';++anzahl);

--sternchen=anzahl;
loese[anzahl]='\0';

for(int i=0; i<anzahl; loese[i]='*', ++i);

while((versuche)&&(sternchen)){
--versuche;
printf("\t\tman darf raten!\n");
printf("%s",loese);
scanf("%c",&zeichen);

for(int i=0; i<anzahl; ++i){
if(zeichen==suche[i]){
loese[i]=zeichen;
--sternchen;
}
}
}
return 0;
}

nur wollte ich nur nicht, dass die ausgabe:


printf("\t\tman darf raten!\n");
printf("%s",loese);

bei mir pro schleifendurchlauf zweimal ausgegeben wird, sondern eben nur einmal.

kann mit jemand helfen ?

wraith
09-11-2004, 15:29
Das Problem ist, daß nach deinen ersten scanf (Zeile: 12), sich noch das '\n' im Buffer befindet.
Der nächste scanf("%c.. Aufruf liest dieses aus, und damit wird die Schleife einmal durchlaufen (also ein zweites mal dein printf Aufruf durchlaufen).

Lösungen:
1. Du änderst deinen scanf Aufruf in scanf(" %c",&zeichen); //Beachte das Leerzeichen vor %c.
Damit wird das Leerzeichen weggelesen.
(das ist aber suboptimal, weil wenn der User mehr als ein Zeichen eingibt, werden diese nacheinander in der Schleife ausgelesen).
Daher...

2. Leere den Input-Stream vorher komplett mit


void eatToNL(FILE * inputStream)
{
int c;
/* Eat till (& including) the next newline */
while ((c = getc(inputStream)) != EOF)
if (c == '\n')
break;
}

Mit einem Aufruf von eatToNL(stdin); vor dem scanf...

Achja, was ist das hier?


--sternchen=anzahl;

Es ist kein korrekter Code. --sternchen ist kein LValue.

doomcalyptica
09-11-2004, 15:56
ok thx,
aber geht auch


fflush(stdin);

also es unktioniert bei mir, nur habe ich leider keine ahnung was das bedeutet. ok fflush(), leert den puffer und stdin heißt sowas wie standart input aber fflush() ist doch für *FILEs gedacht ?

wraith
09-11-2004, 15:58
aber geht auch


fflush(stdin);


Nein.
http://www.comeaucomputing.com/techtalk/#flushinput
fflush funktioniert nur mit Output-Buffer.