Zuerst Mal ein schönes neues Jahr...
Ich habe folgendes Problem.
1
charbuffer[10];
wo ich mit fgets von der Standarteingabe etwas hineinspeichere. Jetzt
will ich wissen, wie ich mit scanf nachschauen kann, ob auch wirklich
das drin ist was ich drin haben will. Soll in meinem Fall so ausschauen:
-LEERZEICHEN1xy
oder
-LEERZEICHENxyLEERZEICHENxy
wobei xy Werte zwischen 1-3 haben darf bzw. soll
Ich hoffe, dass ihr versteht was ich meine :D
lg
Stefan
Fast, aber nicht ganz. Im Prinzip will ich so 4 Zahlen herauslesen.
xy räpresentiert dabei eine Koordinate auf einem 3x3 Spielfeld.
Der Befehlsaufbau sieht ursprünglich so aus:
p xy
oder
c xy xy
das p oder c fang ich dabei schon in einem Schleifendurchlauf ab und es
bleibt somit nur LEERZEICHEN und Zahlen übrig.
eine Sache ist mir jetzt doch noch eingefallen :D
Gibts da noch eine Möglichkeit, dass er eine Chareingabe verbietet?
z.B.: p 1a oder wechselt er dann automatisch in den default Zweig?
Stefan schrieb:> eine Sache ist mir jetzt doch noch eingefallen :D>> Gibts da noch eine Möglichkeit, dass er eine Chareingabe verbietet?
Nein.
fgets frisst was es kriegen kann. Bis zum abschliessenden \n
Es ist dein Bier die Eingabe daraufhin zu untersuchen, ob sie gültig ist
(und genau deshalb eignet sich sscanf nicht besonders gut dazu, wenn am
anderen Ende des Streams ein Mensch sitzt. Wenn die Eingabe von einem
anderen Programm generiert wird, sieht die Sache anders aus. Aber bei
einer menschlichen Eingabe muss man immer mit Fehleingaben rechnen. Und
da man das sowieso analysieren muss, kann man dann auch gleich die
Wandlung in Zahlen auch noch mitmachen. Das ist dann schon fast kein
Mehraufwand mehr)
> z.B.: p 1a oder wechselt er dann automatisch in den default Zweig?
Nix default. sscanf konnte 1 Zahl korrekt lesen und genau das meldet es
dir auch mit seinem Returnwert. Ob diese 1 Zahl dadurch zustande kam,
dass der Benutzer tatsächlich nur "p 1" oder aber "p 1a" eingegeben hat,
kannst du mit sscanf nicht feststellen.
Wenn man es detaillierter haben möchte, bietet es sich an, entweder zu
Fuß zu parsen oder stückweise mit strtol().
Mit letzterem erfährt man jeweils, wie weit das Lesen im String geklappt
hat und kann ab dieser Stelle nachschauen, was da so steht.
Zu was würdest du raten, wie man das am besten macht? Will jetzt
natürlich keinen fertigen Code von dir, aber ein kleiner Denkanstoß in
die richtige Richtung würde mir sicher helfen...
Stefan schrieb:> Zu was würdest du raten, wie man das am besten macht? Will jetzt> natürlich keinen fertigen Code von dir, aber ein kleiner Denkanstoß in> die richtige Richtung würde mir sicher helfen...
Anfangen würd eich damit mir zu überlegen, dass es sich ja immer nur um
Einzelzeichen handelt, die durch eine oder mehrere Whitespace Zeichen
voneinander getrennt sind.
Dein Aufbau sieht doch so aus
Commandozeichen: kann nur p oder c sein
nach dem Commandozeichen kommt auf jeden Fall mal Whitespace
Wenn Commando 'p' dann kommen
x-Koordinate y-Koordinate
Wenn Commando 'c' dann kommen
x-Koordinate y-Koordinate Whitespace x-Koordinate y-Koordinate
Das Pärchen 'xKoordinate y-Koordinate' kommt in beiden Fällen mehrfach
vor. Da bietet es sich also ein eine Funktion dafür zu machen, die ein
Koordinatenpärchen aus dem String holt und mir auch meldet, ob das
gültig war (damit der Aufrufer nicht weiter macht).
AUch für Whitespace überlesen kann man sich eine schöne Funktion machen.
Allen Funktionen gemeinsam ist: Sie kriegen den String und einen Index
ab wo sie loslegen sollen. Und sie modifizieren den Index, so dass man
ihn gelich in die nächste Funktion reinstecken kann und die dann dort
weiter macht, wo die vorhergehende Funktion aufgehört hat.
Die Verwendung in der Hauptfunktion könnte zb so sein
1
fgets(.....)
2
3
nextChar=0;
4
Error=FALSE;
5
SkipWhiteSpace(Input,&nextChar);
6
7
switch(Input[nextChar]){
8
case'p':
9
Error|=SkipWhitespace(Input,&nextChar);
10
Error|=FetchPair(Input,&nextChar,&x1,&y1);
11
if(!Error){
12
machwasmitx1,y1
13
}
14
break;
15
16
case'c':
17
Error|=SkipWhitespace(Input,&nextChar);
18
Error|=FetchPair(Input,&nextChar,&x1,&y1);
19
Error|=SkipWhitespace(Input,&nextChar);
20
Error|=FetchPair(Input,&nextChar,&x2,&y2);
21
if(!Error){
22
machwasmitx1,y1,x2,y2
23
}
24
break;
25
26
default:
27
Error=TRUE;
28
}
29
30
if(Error){
31
printf("Illegal Input: '%s'\n",Input);
32
}
33
34
....
Nachdem geklärt ist, wie ich das ganze verwenden möchte ... wie müssen
daher die Funktionen SkipWhitespace und FetchPair aussehen?