[C++] grundlegende Frage zu C

Flipstar

Commander
Registriert
Jan. 2003
Beiträge
2.474
Hallo,

ich habe heute in der Uni zum ersten Mal mich an C herangewagt und ein sehr simples Programm geschrieben um das ganze mal kennen zu lernen.

Nun meine Frage:

Was muss ich einfügen um zu verhindern, dass nach dem Ausführen der .exe das Fenster gleich wieder geschlossen wird und stattdessen "press any key to continue" dasteht? :)
 
Re: grundlegende Frage zu C

Ein simples
Code:
getchar();
sollte reichen.
Dann wartet der auf eine Zeicheneingabe.
 
Re: grundlegende Frage zu C

Hm, wenn ich das ans Ende schreibe, geht das Fenster trotzdem sofort zu... :(

Hab ich es falsch geschrieben? Ich kenn mich halt noch garnicht aus...

Code:
 [color=#0000ff]
[/color][color=black]#include <stdio.h>[/color]

[color=black]void main()[/color]

{

[color=black]int[/color][color=black] iAlter, iLeet, iRest;[/color]

iAlter = 0;

iLeet = 1337;

iRest = 0;

printf("Bitte geben sie ihr Alter ein...\n\n");

scanf("%d", &iAlter);

iRest = iLeet - iAlter;

printf("\nIhnen fehlen leider noch %d Jahre um Leet zu sein... O_o\n\n\n\n\n", iRest);

getchar();

}
 
Re: grundlegende Frage zu C

Oder einfach in der Windows Eingabeaufforderung das Programm starten. :)

Edit: Versuch das getchar(); mal an den Anfang zu setzen. C arbeitet den Code hintereinander ab, wenn du das Programm startest, kommt er garnicht zu diesem Befehl. C ist nicht objekt-orientiert,

mfg Simon
 
Sollte eigentlich richtig sein, versuchs evtl. mal mit:

Code:
fflush(stdin);
getchar();
return(0);

ich kanns gerade nicht testen, aber das hab ich in nem alten Prog so drin und das hat afaik funktioniert.
 
Bei mir meckert er schon hinter
Code:
void main()
:freak:

Probier mal statt dem einfach
Code:
int main()

Die Zeilen
iAlter=0;
iRest=0;

kannst du auch weglassen, die sind überflüssig, weil du iAlter mit scanf() ja abfragst und iRest ja sowieso berechnen lässt. ;)

mfg Simon
 
Simon schrieb:
Bei mir meckert er schon hinter
Code:
void main()
:freak:
Kann es sein, dass man "void" weglassen kann?


Die Zeilen
iAlter=0;
iRest=0;

kannst du auch weglassen, die sind überflüssig, weil du iAlter mit scanf() ja abfragst und iRest ja sowieso berechnen lässt. ;)

mfg Simon
Ja schon, uns wurde nur gleich eingeklcikert, dass man das lieber dazuschreibt, um nicht irgendwann mal Speicherschrott zu bekommen. :)

Code:
 [color=#0000ff]
[/color][color=black]#include <stdio.h>[/color]
[color=black] [/color]
[color=black]#include <conio.h>[/color]
[color=black] [/color]
[color=black]void main()[/color]
[color=black] [/color]
[color=black]{[/color]
[color=black] [/color]
[color=black]int iAlter, iLeet, iRest;[/color]
[color=black] [/color]
[color=black]iAlter = 0;[/color]
[color=black] [/color]
[color=black]iLeet = 1337;[/color]
[color=black] [/color]
[color=black]iRest = 0;[/color]
[color=black] [/color]
[color=black]printf("Bitte geben sie ihr Alter ein...\n\n");[/color]
[color=black] [/color]
[color=black]scanf("%d", &iAlter);[/color]
[color=black] [/color]
[color=black]iRest = iLeet - iAlter;[/color]
[color=black] [/color]
[color=black]printf("\nIhnen fehlen leider noch %d Jahre um Leet zu sein... O_o\n\n\n\n\n", iRest);[/color]
[color=black] [/color]
[color=black]getch();[/color]
[color=black] [/color]
[color=black]}[/color]
[color=black] [/color]

So hat es jetzt funktioniert, hat mir ein Freund gesagt, warum es geht weiß ich aber nicht. ^^
 
Flipstar schrieb:
Ja schon, uns wurde nur gleich eingeklcikert, dass man das lieber dazuschreibt, um nicht irgendwann mal Speicherschrott zu bekommen. :)
Wenn die Variablen deklariert werden, sind sie automatisch auf 0 (wahr) gesetzt.
Da hat einer zuviel mit Pascal programmiert, wo die Variablen bei der Deklaration tatsächlich erstmal den Wert annehmen, der gerade in der Speicheradresse steht. :)

Wenn du irgendwann mal nach geschriebenen Programmzeilen bezahlt wirst, kann man das machen, aber so bläht es den Code nur unnötig auf.

mfg Simon
 
getchar() als Abschluss funktioniert nur, wenn der Standard-Eingabepuffer leer ist. Das ist er aber nicht, da Du in dem Programm eine Eingabe getätigt hast und scanf() den stdin nicht leert.
Vor dem Einsatz von getchar() musst Du einmal fflush(stdin) ausführen, dann geht das.

Das dusselige "Press any key..." hast Du aber der IDE bzw. dem Compiler zu verdanken, ich vermute Visual C? Der hat mich damit auch immer geärgert.

system("Pause") müsste auch gehen (dann kein fflush(stdin)), aber ich glaube dann muss noch die system.h inkludiert werden.

Gruß
Morgoth
 
Simon schrieb:
Wenn die Variablen deklariert werden, sind sie automatisch auf 0 (wahr) gesetzt.
Ich bin mir ziemlich sicher, dass Variablen in C++ nicht automatisch mit 0 (falsch) initialisiert werden, zumindest macht's Visual C++ nicht sondern gibt beim Compilieren eine Warnung aus.
 
Unter C/C++ werden Variablen nicht automatisch initialisiert. Nur Klassen, die über einen entsprechenden Standardkonstruktor besitzen. Variablen gleich zu initialisieren, bläht den Code nicht auf - im Gegenteil, man setzt so das RAII-Prinzip um, was jeder gute Programmierer tun sollte (resource acquisition is initialization - Ressourcenbelegung gleich Initialisierung).

Weiterhin, ein fflush (stdin) ist nicht zulässig (undefiniertes Verhalten). Es sorgt dafür, dass der Streambuffer in sein Device geschrieben wird. Da stdin jedoch ein Eingabestream ist, geht das nicht.

Variablen sollte man übrigens immer so initialisieren:
Code:
int i = 0;
int alter = 0;
...
Und immer nur eine Variable pro Zeile, das führt sonst nur unnötig zu Verwirrungen.

Solange Du nur unter Windows arbeiten willst, sollte ein system("pause"); völlig okay sein.

kannst du auch weglassen, die sind überflüssig, weil du iAlter mit scanf() ja abfragst und iRest ja sowieso berechnen lässt.
Mitnichten. scanf schreibt nicht unter allen Umständen etwas in die Variable. Dafür muss man den Rückgabewert von scanf prüfen. Wenn die Variable nicht gefüllt wurde, arbeitet man mit uninitialisiertem Speicher. Brandgefährlich... meistens gehts, manchmal nicht. Diese Art von Fehlern zu finden, ist sie schlimmste Strafe, die man bekommen kann.
 
Zuletzt bearbeitet:
Raechaer schrieb:
Ich bin mir ziemlich sicher, dass Variablen in C++ nicht automatisch mit 0 (falsch) initialisiert werden, zumindest macht's Visual C++ nicht sondern gibt beim Compilieren eine Warnung aus.
Sehe ich auch grad, da hat mir der Lehrer ein bisschen Scheiße erzählt. °_°
Geht sogar garnicht mit Integer Variablen, wenn man bei der scanf() Abfrage nichts eingibt.

mfg Simon
 
Gegen das schließen der Konsole kannst du folgendes tun:
1. Erst die Datei "conio.h" einbinden ( gibts die überhaupt in C schon ? )
2. Ans Ende diesen Befehl setzen: while(!(kbhit())) {}

Dürfte funktionieren. Bei mir klappts ;)
 
Naja, mit dieser Lösung ist man aber an DOS oder Windows gebunden. Plattformunabhängig gestaltet sich das schon etwas schwieriger.
 
Zurück
Oben