C durch exit Programm beenden

Hi ich bin ein C-Neuling und habe mich jetzt etwas mit der Materie beschäftigt.
Mein komplexestes Tool, ein Rechner, klappt auch schon ganz gut allerdings will ich dort noch die möglichkeit einfügen durch den Befehl „exit“ oder „X“ das programm zu beenden.
Ich weiß es geht auch ganz einfach über das Fenster aber es geht mir ja ums lernen.
Das Problem ist ich habe „return 0;“ eingefügt, damit man das Programm nach einer Rechnung nicht immer wieder neu starten muss und „Exit_succes“ kriegt sich damit immer in die Haare und beendet nicht das Fenster sondern sorgt dafür das ich Programm selbst nichts mehr machen kann.

Meine Frage, wie kann ich die beiden in einklang bringen?

/*Copyright © bei TimHartmann*/

#include
#include
#include

main ()
{
int i;
for (i = 0; i 4) {
printf("\n\nung\x81ltige Eingabe!\n\n");
system(„pause“);
system(„cls“);
}
if (Abfrage== „exit“){
exit(0);
}
}
return 0;

}

/*Copyright © bei TimHartmann*/

sollte das nicht richtig Formatiert sein, hier ist es richtig formatiert

http://paste.org/pastebin/view/36892

Hallo TimHartmann

Das Problem ist ich habe „return 0;“ eingefügt, damit man das
Programm nach einer Rechnung nicht immer wieder neu starten
muss und „Exit_succes“ kriegt sich damit immer in die Haare
und beendet nicht das Fenster sondern sorgt dafür das ich
Programm selbst nichts mehr machen kann.
Meine Frage, wie kann ich die beiden in einklang bringen?

Ich verstehe noch nicht genau das Problem, aber ich denke Du meinst, dass das Programm nicht weiter reagiert.
Beim Kompilieren bekomme ich die folgende Ausgabe:

a.c:9: Warnung: Rückgabetyp ist auf »int« voreingestellt
a.c: In Funktion »main«:
a.c:24: Fehler: expected »)« before »;« token
a.c:78: Warnung: Vergleich mit Zeichenkettenliteral führt zu unspezifiziertem Verhalten

scanf("%i",&wahl:wink:;

Das hier ist wohl Deine Problemstelle. Du erwartest ein Integer-Wert. Das heißt, wenn Du „exit“ eingibst, wird „wahl“ nicht geändert und „scanf“ liefert einen Fehlercode zurück.

if (Abfrage== „exit“){

Abfrage hast Du nirgends belegt, nur definierst.
Außerdem kann man Zeichenketten nicht so vergleichen, was Du an der Stelle tust ist, Zeiger zu vergleichen. Du müsstest z.B. die Funktion strcmp verwenden. Dein Vergleich hier wird immer false liefern, da die Zeiger „exit“ und Abfrage auf zei verschiedene Speicherbereiche zeigen (siehe auch die letzte Warnung).

Mein Vorschlag für das Menü:

#include 
#include 
#include 

int main()
{
 while (1) {
 char wahl;
 printf("Wähle:\n");
 printf("X beenden\n");
 printf("1 addieren (+)\n");
 printf("2 subtrahieren (-)\n");
 printf("\n");
 printf("Triff deine Wahl jetzt: \n");

 do {
 wahl = getchar();
 } while (isspace(wahl));
 printf("Wahl: %c\n", wahl);

 switch (wahl) {
 case 'X':
 return 0;
 case '1':
 // Rechne x + y
 break;
 case '2':
 // Rechne x - y
 break;
 default:
 printf("\n\nungültige Eingabe!\n\n");
 break;
 }
 }
 return 0;
}

Mit „getchar()“ hole ich mir immer nur ein Zeichen. Beachte, dass ich wegen des „char Wahl“ statt „int Wahl“ nicht mehr mit 1 sondern mit ‚1‘ vergleiche. Mit dem „isspace“ fange ich die Zeilenende ab.

Gruß
Diether

danke für die schnelle und ausführliche antwort.
Das Problem war oder ist folgendes, wenn ich return(0) nutze, wiederholt das Programm die Abfrage nach getaner Rechnung.
Das ist auch mein bestreben gewesen, weil der „nutzer“ nicht nach jeder Rechnung das Programm neu starten soll.

nun wollte ich jedoch noch die Möglichkeit einfügen das Programm durch die eingabe von „exit“ oder „X“ zu beenden.
das Problem bei mir war, das ich das anscheinend nicht korrekt eingebaut habe, da sich einmal das programm nach der Rechnung beendete bzw, nicht mehr zum Anfang zurück sprang sondern und bei der „drücken sie eine Taste…“ meldung verbleibt.

Interresanter weise hatte ich die Meldung die dein Editor Ausgab nicht bekommen wäre interresant zu wissen welchen du nutzt.

deinen Tipp werde ich morgen dann ausprobieren, ein paar Frage habe ich aber noch. hat „break;“ die selbe funktion wie „system(„pause“)“?

und nach deinem Vorschlag müsste ich den Script größtenteils umschreiben, bitte denke jetzt nicht ich wäre faul, aber gibt es auch eine möglichkeit die den befehl „exit“ einfach als befehl zum schließen nutzt? denn wie verhält es sich denn zb. wenn ich jetzt noch einen Wortbefehl einbauen möchte? zb help ein befehl der dann die Funktionsweise erklärt.
Ich suche quasi eine funktion oder wie auch immer einen befehl der die eingabe nach bestimmten wörtern durchsucht, die ich weiter unten definiert habe. quasi eine „if“ beziehung mit worten

so habe deinen vorschlag ausprobiert. hat mich leider nicht wirklich weiter gebracht, im gegenteil wo vorher das programm noch nach jeder rechnung auf den ausgangspunkt zurücksprang, löscht es nun das gesamt fenster und gibt aus „gib X ein:“ er wechelt dann übrigens nach jedem durchlauf automatisch die rechenoperation. und gebe ich einen falschen wert ein fragt er dreimal „drücken sie eine taste“, und dann erst fährt er mit dem rechnen fort.

der befehl ‚x‘ funktioniert jetzt übrigens :smiley: aber halt das Wiederholen nicht ich kann auch einfach nicht meinen fehler finden

http://paste.org/pastebin/view/36908

wenn man natürlich überall die breaks vergisst ist es verständlich warum nichts funktioniert^^

breaks; eingefügt programm funktioniert jetz wie es soll

danke für deine Hilfe!

Hallo,

danke für die schnelle und ausführliche antwort.
Das Problem war oder ist folgendes, wenn ich return(0) nutze,
wiederholt das Programm die Abfrage nach getaner Rechnung.
Das ist auch mein bestreben gewesen, weil der „nutzer“ nicht
nach jeder Rechnung das Programm neu starten soll.

Das hat mit dem „return 0“ nichts zu tun. Du hast eine for-Schleife, erst wenn die durchlaufen ist, wird return 0 ausgeführt und das Programm beendet. Die einzige andere Stelle, in der Du die Schleife verlässt ist durch das exit(0), dies wird aber nie aufgerufen, da der Vergleich der Zeichenketten falsch durchgeführt wird.

nun wollte ich jedoch noch die Möglichkeit einfügen das
Programm durch die eingabe von „exit“ oder „X“ zu beenden.
das Problem bei mir war, das ich das anscheinend nicht korrekt
eingebaut habe, da sich einmal das programm nach der Rechnung
beendete bzw, nicht mehr zum Anfang zurück sprang sondern und
bei der „drücken sie eine Taste…“ meldung verbleibt.

Du hast ein int eingelesen (scanf("%i", &wahl)). Stattdessen müsstest Du eine Zeichenkette einlesen. Der Syntax dafür ist:

char Abfrage [20];
scanf("%s", Abfrage);

Der Aufruf ist aber gefährlich, da Du bei einer Eingabe von mehr als 19 Zeichen in nicht reservierten Speicher hineinschreibst. Besser wäre da ein

gets(Abfrage, 20, stdin);

damit werden maximal 19 Zeichen (plus schließende \0) eingelesen.
Den Vergleich der Eingabe kannst Du dann wie folgt machen:

if (strcmp(Abfrage, "1") == 0) {
 // Rechne +
} else if (strcmp(Abfrage, "2") == 0) {
 // Rechne -
} else if ( (strcmp(Abfrage, "X") == 0)
 || (strcmp(Abfrage, "exit") == 0) ) {
 exit(EXIT\_SUCCESS);
}

Da die Handhabung von Zeichenketten in C nicht so einfach ist empfehle ich Dir, dies erst nach etwas Erfahrung zu verwenden.

Interresanter weise hatte ich die Meldung die dein Editor
Ausgab nicht bekommen wäre interresant zu wissen welchen du
nutzt.

Als Editor verwende ich den vim, Du meinst aber den Compiler. Da verwende ich den gcc Version 4.4.5

deinen Tipp werde ich morgen dann ausprobieren, ein paar Frage
habe ich aber noch. hat „break;“ die selbe funktion wie
„system(„pause“)“?

Nein. „break;“ ist ein C-Befehl, mit dem die innerste Schleife verlassen wird (bei meinem Beispiel die Endlosschleife). system() ist eine Funktion, mit der Befehle an die Kommandozeile (bei Dir das DOS-Fenster) gegeben werden köennen. Wenn Du diesen Befehl verwendest, ist das Programm nicht mehr portabel (ich verwende eine andere shell, die kennt die Befehle „pause“ und „cls“ nicht). Du kannst mit system beliebige andere Programme aufrufen, zum Beispiel system(„explorer“).

und nach deinem Vorschlag müsste ich den Script größtenteils
umschreiben,

Ich habe aus zwei Gründen den Code fast neu erstellt. Zum einen denke ich ist er so einfacher zu verstehen, da ich ihn auch knapp gehalten habe, zum zweiten hast Du überall Dein copyright eingetragen, dieses wollte ich nicht verletzen.

bitte denke jetzt nicht ich wäre faul, aber gibt
es auch eine möglichkeit die den befehl „exit“ einfach als
befehl zum schließen nutzt?

exit() beendet das Programm. Das kannst Du in diesem Fall gut verwenden, nur bei komplexeren Programmen ist dies ungünstig. Dann sind meistens noch Aufräumarbeiten zu tätigen oder der aktuelle Stand zu speichern. Da ist es besser, den Ablauf in main() wie folgt zu gestalten:

  1. Vorbereitung (wie Variablen definieren, letzte Einstellungen laden)
  2. Hauptschleife, in der der Benutzer das Programm bedienen kann
  3. Programm „herunterfahren“, letzte Einstellungen speichern, ggf. Benutzer fragen, ob gepeichert werden soll.
    Übrigens: Dein Programm erstellt kein Fenster und es gibt auch nichts zu schließen. Was passiert ist, dass Deine Entwicklungsumgebung eine DOS-Shell öffnet, in der Dein Programm durchlaufen lässt und beim Ende des Programms die Shell wieder schließt. Du kannst Dein exe-Programm auch direkt aus der DOS-Eingabeaufforderung aufrufen.

denn wie verhält es sich denn zb.
wenn ich jetzt noch einen Wortbefehl einbauen möchte? zb help
ein befehl der dann die Funktionsweise erklärt.
Ich suche quasi eine funktion oder wie auch immer einen befehl
der die eingabe nach bestimmten wörtern durchsucht, die ich
weiter unten definiert habe. quasi eine „if“ beziehung mit
worten

Siehe oben: strcmp()

Gruß
Diether