Seite 1 von 1

Fehlerhafte Eingabe Sequenz

Verfasst: Di Feb 18, 2020 2:38 pm
von LinkinMaster
Hallo zusammen,
ich versuche gerade eine Eingabesequenz zu programmieren, die bei fehlerhafter Eingabe die Eingabe wiederholen soll. Bei der ersten Eingabe funktioniert noch alles. Das Problem tritt bei den weiteren Schleifendurchläufen auf. Anbei habe ich meinen Code und meinen Terminal Auszug. Ich verstehe einfach nicht wo der Fehler, daher bitte ich um eure Hilfe.
Danke!

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>	// toupper()

// Definition der verwendeten Konstanten
#define MAX_SPIELFELD 26	// Maximale Zeilen und Spaltenzahl
#define MIN_SPIELFELD 10	// Minimale Zeilen und Spaltenzahl

// Hauptprogramm
int main(void){

	int Spalte=0;
	char Zeile=0, Aktion=0;

	// Eingabe
	while(1){
		printf("\nSpielzug (mit 'A A 0' beenden):");
		scanf("%c %c %d",&Aktion,&Zeile,&Spalte);

		Aktion = toupper(Aktion);
		Zeile = toupper(Zeile);

		if((Aktion == 'A') && (Zeile == 'A') && (Spalte == 0)){
			printf("\nBeende Spiel!\n");
			return 0;
		}
		else if((Aktion != 'M') && (Aktion != 'A')){
			printf("\nFalsche gewählte Aktion!\n");
			continue;
		}
		else if(Zeile <65 || Zeile > 90 || Spalte <= 0 || Spalte > MAX_SPIELFELD){
			printf("\nSpielzug ausserhalb definiertem Spielfeld!\n");
			continue;
		}
		else{
			printf("\nKorrekter Spielzug!\n");
			continue;
		}
	}// End while
	return 0;
}// End main()
Terminal Auszug:

Code: Alles auswählen

Spielzug (mit 'A A 0' beenden):a a 1

Korrekter Spielzug!

Spielzug (mit 'A A 0' beenden):a a 1

Falsche gewählte Aktion!

Spielzug (mit 'A A 0' beenden):a a 1

Spielzug ausserhalb definiertem Spielfeld!

Spielzug (mit 'A A 0' beenden):
Korrekter Spielzug!

Spielzug (mit 'A A 0' beenden):a a 1

Falsche gewählte Aktion!

Spielzug (mit 'A A 0' beenden):a a 1

Spielzug ausserhalb definiertem Spielfeld!

Spielzug (mit 'A A 0' beenden):
Korrekter Spielzug!

Spielzug (mit 'A A 0' beenden):

Re: Fehlerhafte Eingabe Sequenz

Verfasst: Di Feb 18, 2020 2:53 pm
von Xin
Ähh... da haben wir doch schon was auf Lager:

Wie und wieso soll ich die Standardeingabe löschen?

Re: Fehlerhafte Eingabe Sequenz

Verfasst: Di Feb 18, 2020 4:07 pm
von LinkinMaster
Vielen Dank!
Habe es jetzt für mich folgendermaßen gelöst:

Code: Alles auswählen

#include <stdio.h>

void clear_stdin()
{
    int ch; /* Wichtig! Muss int, und nicht char sein. */
    while( (ch = getchar()) != '\n' && ch != EOF )
        /* Nichts tun */;
}

// Hauptprogramm
int main(void){

	int Spalte=0;
	char Zeile=0, Aktion=0;

	// Eingabe
	while(1){
		//fflush(stdin);
		printf("\nSpeilzug (mit 'A A 0' beenden):");
		scanf("%c %c %d",&Aktion,&Zeile,&Spalte);
		printf("\n%c %c %d\n",Aktion,Zeile,Spalte);
		clear_stdin();

	}// End while

	return 0;
}// End main()

Hättest du vielleicht noch ein Tip warum fflush(stdin) nicht funktioniert?
Nach dem was ich mir an gelesen habe sollte er das gleiche wie clear_stdin() bewirken?!

Re: Fehlerhafte Eingabe Sequenz

Verfasst: Di Feb 18, 2020 5:16 pm
von Xin
LinkinMaster hat geschrieben:
Di Feb 18, 2020 4:07 pm

Code: Alles auswählen

	while(1){
		//fflush(stdin);
		printf("\nSpeilzug (mit 'A A 0' beenden):");
		scanf("%c %c %d",&Aktion,&Zeile,&Spalte);
		printf("\n%c %c %d\n",Aktion,Zeile,Spalte);
		clear_stdin();
	}// End while
Hättest du vielleicht noch ein Tip warum fflush(stdin) nicht funktioniert?
Nach dem was ich mir an gelesen habe sollte er das gleiche wie clear_stdin() bewirken?!
Das ist meineswissens aber nicht das Standard-Verhalten von fflush, sondern ein nicht standardisiertes Gimmick. Wenn es funktioniert - schön.
flush heißt ja im Prinzip auch, dass alle Daten auf die Konsole ausgespült werden sollen, die noch im Zwischenspeicher sind. stdin kann nichts ausgeben.
Die Reaktion von fflush auf einen Eingabepuffer ist nicht definiert. Wenn es nicht funktioniert ist das trotzdem entsprechend des Standards vollkommen in Ordnung.
Du musst tatsächlich den Eingabestream auslesen - das ist definiertes Verhalten.