scanf Eingabe soll variieren
-
Hallo!
Ich soll grad ein kleines Programm bauen, das vereinfacht erstmal nur 2 Werte und einen Operator in der Form "Wert1 Operator Wert2" über scanf einliest, bis man Q eingibt um das Programm zu beenden, bzw in meinem Fall erstmal aus der Schleife zu springen.
Hier ist erstmal mein Code:int main () { int run = 1; int check = 0; float wert1 = 0; float wert2 = 0; char op[1] = ""; printf("Bitte machen Sie Ihre Eingabe in der folgen Form: Wert1 Operator Wert2\n"); printf("Zum Beenden geben Sie q oder Q ein!\n\n"); while( run == 1 ) { printf("Ihre Eingabe: "); check = scanf("%f %c %f", &wert1, &op, &wert2); if (check == 3) { printf(" Wert1: %.2f\n", wert1); printf(" Operator: %c\n", op[0]); printf(" Wert2: %.2f\n\n", wert2); } else { printf("FEHLER!"); } } }
Wenn man 2 Werte eingibt, also zum Beispiel: 500 + 7, erscheint die Ausgabe korrekt. Doch wenn man über scanf nicht 3 mit einem Leerzeichen getrennte Zeichen(ketten) eingibt, stürzt das Programm gleich ab. Habe versucht das irgendwie mit der variable check abzufangen (hier steht, dass das gehen soll: http://pronix.linuxdelta.de/C/standard_C/c_programmierung_6.shtml), aber das funktioniert nicht. Weiss jemand, wie ich das lösen kann im Hinblick darauf, zu sehen ob der Benutzer ein Q eingegeben hat oder eben die beiden Werte und den Operator...?
Vielen Dank für Eure Hilfe!!
-
zerlege die zeichenkette selbst und wende das scanf auf die einzelteile an.
1. String: zeichen des inputstrings bis zur ersten nicht-ziffer
2. String: zeichen des restinputstrings bis alle zeichen des operators eingelesen sind (am anfang mal nur ein char)
3. string: zeichen des restinputstrings bis zur ersten nicht-ziffer
dann wendest du scanf auf die einzelstzrings an
-
vlad_tepesch schrieb:
zerlege die zeichenkette selbst und wende das scanf auf die einzelteile an.
diese zeichenkette muss ich ja aber auch erstmal über die tastatur mittels scanf einlesen. und wenn der benutzer sich dabei nicht an die vorgegebene formatierung hält, stürzt das programm ja wieder ab..?
-
du kannst die zeichenkette aber zuerst in ein chararray einlesen.
char buff[10000]; scanf("%s", buff); // achtung <- gefahr eines bufferoverrun
anschließend zerlegst du diese zeichenkette
-
ich bin am verzweifeln
ich fass mal zusammen was ich habe:
diese variablen:
char eingabe[21] = ""; char wert1[10] = ""; char op[1] = ""; char wert2[10] = "";
die eingabe wird in der gleichnamigen zeichenkette gespeichert.
printf("Ihre Eingabe: "); fgets(eingabe, 21, stdin);
das funktioniert alles 1a... doch nun beim zerlegen der kette "eingabe" in die 3 bestandteile tritt ein seeehr!!!!! mysteriöser fehler auf.
also ich durchlaufe die zeichenkette "eingabe" bis ich auf ein leerzeichen stoße (ascii code 32), und kopiere bis zu der position alle zeichen in die variable wert1, und füge am ende sogar noch die binäre null an, um das ende von wert1 zu markieren!//wert1 aus der Eingabe filtern i = 0; j = 0; while (eingabe[i] != 32) { wert1[j] = eingabe[i]; i++; j++; } wert1[j] = 0;
die ausgabe
printf("Wert1: %s\n", wert1);
funktiniert auch wunderbar!
doch nun kommts. als nächstes soll der operator gefiltert werden. dazu brauch ich ja nur die zählervaribale i ein weiterzählen, um das leerzeichen zu überspringen, dann das zeichen aus eingabe[i] in op[0] kopieren und hinterher wieder die binäre null anhängen:
//op aus der Eingabe filtern i++; op[0] = eingabe[i]; op[1] = 0;
wenn ich das mache, wird ganz seltsamerweise wert1 nicht mehr angezeigt. dann hab ich mir die genauen ascii codes von wert1 ausgeben lassen und gesehen, dass wert1[1] ... wert1[n] alles noch richtig sind, nur in wert1[0] nun auf einmal eine binäre null ist, weshalb wert1 natürlich nicht angezeigt werden kann. doch wie zum teufel kommt da eine binäre null rein !?!?!?!?
printf(" Wert1: %s\n", wert1); printf(" Operator: %s\n", op);
Ich wäre so glücklich, wenn jemand weiß woran das liegen könnte
-
noch ein zusatz. selbst das funktjioniert nicht:
wert1[0] = 49; wert1[1] = 48; wert1[2] = 48; wert1[3] = 0; op[0] = 43; op[1] = 0; printf(" Wert1: %s\n", wert1); printf(" Operator: %s\n", op);
hab das eben ausprobiert, um zu gucken, ob ich doch irgendwo einen fehler in den zählvariablen oder so habe. aber selbst nach der direkten zuweisung wird wert1[0] durch die beiden zuweisungen op[0] = 43; und op[1] = 0; zerstört... wie kann das bloß angehen????
-
Hab keine Zeit, mir das anzuschauen, aber beim überfliegen habe ich schon das gesehen:
char op[1] = "";
mach wenigstens 2 dahin. \0 verwendet schon ein Zeichen -> kein Platz im String für weitere Daten.
-
feigling schrieb:
Hab keine Zeit, mir das anzuschauen, aber beim überfliegen habe ich schon das gesehen:
char op[1] = "";
mach wenigstens 2 dahin. \0 verwendet schon ein Zeichen -> kein Platz im String für weitere Daten.
tatsache.. es funktioniert! vielen dank!! nur dachte ich das zeichen wird in op[0] gespeichert und in op[1] steht dann die binäre null.. seltsam.. aber ok