Taschenrechner in C

{
char z;
float x;
float y;
float Loesung;

printf(„Bitte geben Sie zwei Zahlen ein:\n“);
scanf("%f; %f", &x, &y);
printf(„Bitte geben Sie die gewuenschte Rechenoperation ein:\n“);
scanf("%s\n", &z);

if ( z == ‚+‘)
Loesung = x + y;
if ( z == ‚-‘)
Loesung = x - y;
if ( z == ‚*‘)
Loesung = x * y;
if ( z == ‚/‘)
Loesung = x / y;

printf(„Loesung: %f\n“, Loesung);

return 0;
}

wieso kann ich hier den Inhalt der Variablen z nicht mit den angegebenen Zeichen vergleichen? Liegt mein Fehler im Adress-Operator, muss ich mit Zeigern arbeiten? Ich komm echt nicht mehr weiter.

Wäre um eine Antwort sehr dankbar.

Hallo!

wieso kann ich hier den Inhalt der Variablen z nicht mit den
angegebenen Zeichen vergleichen? Liegt mein Fehler im

Worin zeigt sich das? Bei mir gehts:

$ ./a.out 
Bitte geben Sie zwei Zahlen ein:
4; 5
Bitte geben Sie die gewuenschte Rechenoperation ein:
-
Loesung: -1.000000
$ 

Der Code ist sicherlich diskussionswürdig. Aber ich nehme an, dass das so die ersten Gehversuche sind.

Fortranner

char z;

stellt nur den Speicherplatz für ein Zeichen bereit

scanf("%s\n", &z);

liest aber kein Einzelzeichen ein, sondern eine Zeichenkette. Damit schreibst Du in andere Speicherbereiche. Effekt undefinierbar.
Selbst ein Einzelzeichen würde zwei Byte belegen ‚-‘ und ‚\n‘.

Also immer sicherstellen, dass eingelesene Inhalte nicht größer sind als der bereitgestellte Speicherplatz. Über die Wahl der Einlesefunktion kann dieses erzwungen werden, weil die Funktion nur ein Zeichen liest (z.B. fgetc, getchar, getch) oder eine Längenschränkung enthält (z.B. über Formatstring, fgets)

if ( z == ‚+‘)
Loesung = x + y;
if ( z == ‚-‘)
Loesung = x - y;
if ( z == ‚*‘)
Loesung = x * y;
if ( z == ‚/‘)
Loesung = x / y;

Fehlerfrei aber nicht perfekt, da das Durchlaufen aller Vergleiche unnütz ist. Besser else verwenden oder switch und exit.
Sehr unsauber ist dagegen, dass ein 5. Fall (Keines der Zeichen) unberücksichtigt bleibt: Fehlermeldung fehlt und stattdessen wird ein evtl. nicht gesetzter Wert für Loesung genutzt.

printf(„Loesung: %f\n“, Loesung);

return 0;
}

Passt.

wieso kann ich hier den Inhalt der Variablen z nicht mit den
angegebenen Zeichen vergleichen?

Folgefehler des ersten fatalen Bugs.

Liegt mein Fehler im
Adress-Operator, muss ich mit Zeigern arbeiten? Ich komm echt
nicht mehr weiter.

Jein, wenn Du’s z.B. mit char z[2] und entsprechend richtiger Adressierung realisiert hättest, wäre das Problem nicht aufgetreten.

Wäre um eine Antwort sehr dankbar.

Bitte sehr. War was für mein Langzeitgedächtnis.

Ciao, Allesquatsch

Vielen Dank für deine schnelle Antwort, mit char[2] hatte ich es auch schon probiert, aber es hat bei mir leider nicht funktioniert. Werd’ mich wohl nochmal dran machen müssen.

Vielen Dank für deine Antwort. Leider bin ich gerade erst beim Lernen von C. Wir haben es im Studium … daher wohl auch der schlechte Stil :/. Mit was hast du den Code kompiliert? Der Fehler äußert sich darin, dass mein Programm immer beendet wird, wenn er die Var. z vergleichen will. Wir benutzen VC++ von MS.

Ich hab’ mir den Code nochmal angeschaut und dann erkannt, wo denn nun meine Fehler liegen - vor allem dass ich die Art der Eingabeform so stark beachten muss ist schlecht. Das der Code nicht so toll ist, ist nun auch für mich offensichtlich.

Auch wenn Du die restlichen Verwendungen von z richtig angepasst hast?

Ist natürlich trotzdem nicht gut, in ein Feld mit einem Zeichen Platz etwas einzulesen, was größer sein kann und dann irgendwo den Speicher überschreibt.

Ändere liebe mal nur die Lesefunktion für z in eine Zeichenlesefunktion wie getchar.

Ciao, Allesquatsch