Fehlerhafte Eingabe Sequenz

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
LinkinMaster
Beiträge: 9
Registriert: Mo Jan 27, 2020 4:50 pm

Fehlerhafte Eingabe Sequenz

Beitrag von LinkinMaster » Di Feb 18, 2020 2:38 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fehlerhafte Eingabe Sequenz

Beitrag von Xin » Di Feb 18, 2020 2:53 pm

Ähh... da haben wir doch schon was auf Lager:

Wie und wieso soll ich die Standardeingabe löschen?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

LinkinMaster
Beiträge: 9
Registriert: Mo Jan 27, 2020 4:50 pm

Re: Fehlerhafte Eingabe Sequenz

Beitrag von LinkinMaster » Di Feb 18, 2020 4:07 pm

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?!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fehlerhafte Eingabe Sequenz

Beitrag von Xin » Di Feb 18, 2020 5:16 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten