» Tastatureingabe mit "Scanf"

Element an bestimmte Postion einfügenNeuen Thread eröffnenNeue Antwort erstellenVerständnisfrage zu: Adress- und * Operator
AutorNachricht
Beobachter 
Anmeldedatum: 06.06.2020
Beiträge: 2
06.06.2020, 15:24
zitieren

Liebes Forum,

für ein Uniprojekt muss ich das Spiel "Vier Gewinnt" als Programm in C umsetzen. Es ist das erste Mal, dass ich überhaupt programmiere, seit bitte etwas nachsichtig mit mir ;) .

Folgendes Problem habe ich: Ich möchte mithilfe von "scanf" eine Tastatureingabe einlesen. Erlaubte Eingaben sind nur die Zahlen von 1-7. Bei allen anderen Eingaben soll eine Fehlermeldung kommen. So habe ich es bisher geschrieben:


#include <stdio.h>

void spielzug(int spielfeld[7][7], int spieler) /*Funktionsdeklaration*/
{
int spaltenwahl; /*spaltenwahl wird initialisiert, fungiert als Eingabevariable*/
int fehler; /*fehler wird initialisiert, fungiert als Austrittsbedingung*/

printf("\nSpieler %i", spieler); printf(" ist an der Reihe. Bitte wähle eine Spalte zwischen 1 und 7 und bestätige mit ENTER:\n"); /*Erstmalige Eingabeaufforderung an aktuellen Spieler*/

do
{
scanf("%d", &spaltenwahl); /*Einlesen der Eingabe*/
printf("\n\nEingegeben:%d\n\n", spaltenwahl); /*Debug Feature: Kontrolle, ob richtig eingelesen wurde.*/
if (spaltenwahl > 0 && spaltenwahl < 8) /*Bedingung: Spaltenwahl muss zwischen 1 und 7 sein*/
{
printf("Eingabe gültig."); fehler = 0; /*Debug Feature: Kontrolle, ob richtig entschieden wurde*/
}
else
{
printf("Eingabe ungültig.\n\n\nSpieler %i", spieler); printf(", bitte wähle eine Spalte zwischen 1 und 7.\n"); fehler = 1; /*Fehlermeldung, wenn Eingabe nicht zwischen 1 - 7 liegt*/
}

} while (fehler != 0);


}

Das Problem ist: Solange man eine Zahl außerhalb des Intervalls eingibt, kommt die richtige Fehlermeldung. Wenn man aber einen Buchstaben eingibt, wird die Fehlermeldung mit unendlich vielen Wiederholungen ausgegeben. Meine Vermutung ist, dass es mit dem Einlesen zu tun hat, da ich dort nur "%d" eingegeben habe. Leider habe ich keine Alternative dazu gefunden, vielleicht kann mir ja hier jemand helfen...

Vielen Dank im Voraus!


pn
Trainee 

Name: Mirko
Geschlecht:
Anmeldedatum: 06.12.2019
Beiträge: 46
Wohnort: Weingarten
06.06.2020, 19:11
zitieren

Hallo cmdStock11,

in C ist das leider nicht ganz ohne, dieses Thema. Denn C nimmt dir die Arbeit diesbezüglich nicht ab. Du musst dich um noch so jede Kleinigkeit selber kümmern.
Außerdem halte ich persönlich die Funktion scanf für eine liederliche Funktion. Ich verwende sie eigentlich niemals.
Wenn ich in eine Situation komme, in der ich die Eingabe pingelig auswerten muss, dann speichere ich die Eingabe grundsätzlich als Zeichenkette ab. Da kann der Nutzer eingeben was er will und Fehlermeldungen werden vermieden. Dann liegt es allerdings an mir die Zeichenkette so zu behandeln, wie es das Programm benötigt.

Schau dir bitte mal die Funktion fgets an und mach dich etwas mit der ASCII-Tabelle vertraut. Du wirst sehen, da kann scanf nicht mithalten. Zumindest nicht in diesem Fall.
Weiterhin poste ich dir einen Beispielcode, mit jede Menge Kommentaren, den Du nahezu eins zu eins in deinem Code verwenden kannst.


#include <stdio.h>

/* Maximale Anzahl der zu speichernden Zeichen */
#define STRING_LENGTH 3

int main() {

    /* Array zum Speichern des Eingabestrings */
    char str[STRING_LENGTH];

    /* Zum Speichern der gültigen Eingabe als Integer */
    int spaltenwahl;

    /* Funktion der Standardbibliothek, zum Einlesen eines Strings.  /
    /  Erwartet als Argumente das Array (Zeiger),                    /
    /  die Zeichenkettenlaenge inklusive das NULL-Byte,              /
    /  und den Stream, in diesem Fall die Standardeingabe           */
    fgets(str, STRING_LENGTH, stdin);

    /* Vergleich des ersten Zeichens der Zeichenkette mit den in  /
    /  der ASCII-Tabelle hinterlegten Werten.                     /
    /  48 entspricht darin 0                                      /
    /  56 entspricht darin 8                                     */
    if (str[0] > 48 && str[0] < 56) {
        /* Wenn erstes Zeichen groesser 0 und kleiner 8 */
        printf("Eingabe gueltig...\n");

        /* Erstes Zeichen der Zeichenkette wird in ein Integer     /
        /  umgewandelt und an die Variable spaltenwahl uebergeben  /
        /  Da die 0 in der ASCII-Tabelle bei dezimal 48 beginnt    /
        /  kann man die Zahl abziehen und erhält dadurch die       /
        /  eingegebene Zahl. Zeichen wird dann "gecastet" durch    /
        /  das vorangestellte (int)                                */   
        spaltenwahl = (int)str[0] - 48;
        printf("Spalte: %d\n", spaltenwahl);
    }   
    else
        printf("Eingabe ungültig...\n");

    return 0;
}

Ich hoffe das hilft dir weiter und ich wünsche dir noch ein schönes Wochenende.


pn
Beobachter 
Anmeldedatum: 06.06.2020
Beiträge: 2
07.06.2020, 00:34
zitieren

Danke dir! Hat mir sehr geholfen :)

pn
Junior 
Name: Voller Name als Anagramm: Fitje Weshoms
Geschlecht:
Fahrzeug: Yamaha YZF R6 Thundercat
Anmeldedatum: 15.07.2012
Beiträge: 92
Wohnort: Amberg, Oberpfalz
11.06.2020, 07:26
zitieren

Hallo Leute!

Es geht etwas einfacher:

include <stdio.h>
#include <stdlib.h>

void clpuf(void)
 {
 while (getc(stdin) != '\n')
    ;
 }

int main()
{
 int i;
 char c_posi[200] = {0};
 char c_nega[200] = {0};

  printf("Beispiel Positiv- und negativ Liste bei scanf\n");

 printf("\nPositiv-Liste:\n");
 printf("Bitte zum Test einen String\nMuster.....: 123430abc  \neingeben.\nEingabe:  ");

/** liest nur Zeichen ein die innerhalb der eckigen Klammern stehen
   * und beendet die Eingabe in  die Variable beim ersten Zeichen, das nicht
   * in der Liste steht*/

 i = scanf("%15[0123456789+-*/=]", c_posi);
 printf("Die Eingabe war: %s \ni=%d\n", c_posi, i);

 /** Beseitigt die restlichen im Tastaturpuffer stehenden Zeichen, da diese sonst
   * bei der naechsten Eingabe wieder verwendet werden */
 clpuf();

 printf("Negativ-Liste-Liste:\n");
 printf("Bitte zum Test einen String\nMuster.....: asdfgh123  \neingeben.\nEingabe:  ");
 i = scanf("%[^1234567890]", c_nega);
 printf("Die Eingabe war: %s \ni=%d\n", c_nega, i);

 clpuf(); /** Tastaturpuffer leeren*/

 printf("\nBitte zum Test einen String mit Leerzeichen eingeben\nEingabe:  ");
 /** liest alle Zeichen ausser den Newline-Zeichen(Enter-Taste) ein*/
 ///scanf("%21[^\n]", c_nega); ---> wäre eine Begrenzung auf 21 Zeichen beim einlesen
 scanf("%[^\n]", c_nega);
 printf("Die Eingabe war: %s \n\n", c_nega);i = scanf("%15[0123456789+-*/=]", c_posi);

 printf("Das Programm wird nun beendet.....\n");
return EXIT_SUCCESS;
}

Zur Beschreibung:

Die Funktion clpuf() löscht den Inhalt des Tastaturpuffers.

Bei
i = scanf("%15[0123456789+-*/=]", c_posi);
werden nur Zeichen angenommen, welche innerhalb der rechteckigen Klammern stehen.
Die Zahl 15 vor der ersten rechteckigen Klammer beschränkt die Eingabe auf maximal
15 Zeichen. So kann man einen Pufferüberlauf vorbeugen. Bei der ersten Eingabe eines
Zeichens, welches nicht in der Liste steht, wird die Eingabe abgebrochen.

i = scanf("%[^1234567890]", c_nega);

Dagegen ist eine sogenannte Negativ-Liste.

scanf("%[^\n]", c_nega);

liest alle Zeichen außer den Newline-Zeichen(Enter-Taste) ein, auch Leerzeichen.
So kann man auf einfache Weise einen Satz einlesen.


pn
Trainee 

Name: Mirko
Geschlecht:
Anmeldedatum: 06.12.2019
Beiträge: 46
Wohnort: Weingarten
13.06.2020, 14:48
zitieren

Hallo Guiseppe,

cooles Beispiel. Aber ob das ein Programmieranfänger wirklich als leichter empfindet, bezweifle ich jetzt mal ganz provokativ. :D
Zumal sich vielleicht cmdStock11 noch gar nicht im Klaren darüber ist, warum er den Puffer überhaupt leeren sollte.
Aber cooles Beispiel... ;)


pn
Gast 
13.06.2020, 14:48
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "Tastatureingabe mit "Scanf"" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
V-one "s Honda Civic Eg4 ("S.78Civic später Start in die "noch gerade so" Saison,Bilder ")
(Nachtrag 24.02.2011,Die Bilder neu reingestellt damit die Historie Nachvollziehbar,sowie anschaulich bleibt) Hier wollte ich mal mein Honda Civic vorstellen :) So sah er aus als ich in bekommen habe: Sieht mal zunächst als Basis nicht sonderlich übel...
von V-one
779
48.334
28.09.2017, 06:17
SandydelSol
mysql_query(......) "Spalte"/"Variable" lässt sich nicht mit einer Eingabe vergleichen
Hey, ich will eine ganz normale Abfrage machen, ob der vom Nutzer eingegebene Name/Wert bereits irgendwo in der Datenbank vorhanden ist. So sieht das bei mir aus: $nogroups = mysql_query&#40; "SELECT * FROM memberinformation WHERE nickname...
[PHP]von Section
4
1.213
23.07.2012, 13:09
Section
"Unfall" brauche Hondateile raum Bodensee, Allgäu. "HILFE"
Olla Leuz Hatte heut nen unfall mit meinem eg5 :cry: :wall: Jetzt is meine Komplett front im eimer......und brauche jetzt Motorhaube, beide Scheinwerfer ,Frontstoßstange , Kühler mit Lüfter , und das Komplette Frontgerüst :( Kennt von euch...
von civic4live
10
2.806
14.07.2006, 16:32
civic4live
ein "nicht honda fahrer" mit "hondapower" braucht eure hilfe
hallo forum, ich habe hier ein wenig rumgestöbert und brauch enun mal dringend eure hilfe. ich fahre einen alten klassischen mini (cooper), den ich die letzten 1,5 jahre auf honda ed9 d16z5 umgebaut habe. das ganze ist in einem eigenbaurahmen und...
von kelmiinthafirma
4
3.275
16.07.2009, 09:04
kelmiinthafirma
Frechen 02.07.2010 "Japan wird Weltmeister" - "doch nich =("
so wer kommt diesen freitag...
von Toby1991
39
11.829
05.07.2010, 20:40
stoffi88
Project "road trip nach Polen" "IST-Bilder jetzt"
So morgen junx, da mein Honda, ein sehr schweren Hagelschaden erleiden musste, bin ich jetzt dabei einen Trip nach Polen zu planen, um meinen Honda Komplett neu zu lackieren. Was ich vorab noch unbedingt brauche, ist eine neue Motorhaube für denn...
von tr0Un-1337
9
1.817
06.07.2008, 20:25
tr0Un-1337
Civic MB2 2131/313 "1999" Scheibenbremse/Beläge hinten "Größe"???
Hallo Leutz, ich habe da mal ein Problem. Ich wollte bei einem Bekannten an seinem Honda Civic HSN:2131 / TSN:313; Baujahr 09.1999; 66KW 5-Türer (Fastback) die hintere Bremse Wechseln (beide Scheiben und Beläge) Nun habe ich im Internet (ebay u.s.w.)...
von Sisko865
6
489
17.08.2014, 18:27
Blues
Android Chrome: "Artikel für Sie" bzw "Suggested Articles" anpassen?
Gibt es irgendwo die Möglichkeit die Domains / Newsseiten, die auf der Startseite angezeigt werden, einzustellen? Ich bekomme z.b. News von Bild.de (Clickbaiting), Chip.de (Clickbaiting) und Focus.de (Kommentare Pegida verseucht) und da das der letzte...
von mgutt
3
633
11.03.2020, 20:04
mgutt
Suche gutachten für Fujitsubo duplex "FGK0S2E" "e4-81/334- 93001" für ed9 !
hi, bin auf der Suche nach einem Gutachten/ ABE für einen Fujitsubo Duplexschalldämpfer. Und zwar hat dieser die Kennung "FGK0S2E" "e4-81/334- 93001" Sollte an CRX ED9 passen... Bin für jede Hilfe dankbar und hoffe, das hier jemand...
von Crazycasanova
3
368
29.07.2014, 11:05
Crazycasanova
"Japanischer Käse" goes to "Polen", Sitze sind bei Näherei,
Hey Hey, habe heute mal angefangen meinen ED9 weiter zu zerlegen und dachte mir ich zeige euch mal was ich für lustige Sachen entdeckt habe. Wenn ihr auch sowas hatte dann schreibt mir mal bitte ob ihr RepBleche genommen habt und zum K-bauer...
von -eisbaer-
100
6.603
07.09.2012, 16:26
NipponVtec
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |