Schnelle objektorientierte, kompilierende Programmiersprache.
-
LinkinMaster
- Beiträge: 9
- Registriert: Mo Jan 27, 2020 4:50 pm
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):
-
Xin
- nur zu Besuch hier
- Beiträge: 8858
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
-
Kontaktdaten:
Beitrag
von Xin » Di Feb 18, 2020 2:53 pm
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
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?!
-
Xin
- nur zu Besuch hier
- Beiträge: 8858
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
-
Kontaktdaten:
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.