PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : cout vs. printf



nathex
21.05.2009, 09:13
Moin Free-Hacker's,

Bin noch ziemlich am Anfang von C++ (so etwa bei den Grundlagen), jedoch habe ich mir gedacht warum man cout verweden soll, wenn printf doch eigendlich mehr funktionen hat... da könnte man sich doch direkt printf angewöhnen, oder nicht?
Außerdem kann man bei Programmen mit GUI doch garkein cout mehr benutzen, da man keine console hat, oder?

Wäre dankbar für ein paar aufklärende Antworten :rolleyes:;)

mfg
nathex

blackberry
21.05.2009, 11:44
count ist keine Funktion.
cout ist ein Objekt der Klasse ostream.

printf ist eine Funktion der "C Run Time Library".
Wenn du eine komplette Funktionsreferenz von ostream willst, dann schau dir mal das an:
http://www.cplusplus.com/reference/iostream/ostream/

Im Grunde kann man sagen:
count = C++
printf = C (wobei es wegen Kompatibilitätsgründen auch in C++ aufgenommen wurde)

Persönlich finde ich printf besser, da man für cout iostream (bzw. ostream) inkludieren muss, was die Größe des Programms bereits um mehrere 100 Bytes erhöht.

Um auch bei GUI's printf und/oder cout benutzen zu können kannst du deine GUI's in einer main-Funktion, anstelle einer WinMain-Funktion schreiben.

Du könntest natürlich auch mit LordPE (-> Google) dein Programm öffnen, dann bei "Subsystem" auf den Button mit "..." klicken und dann unter "Set Flags" "Windows Console" anklicken (danach auf "OK" klicken und mit "Save" abspeichern).


Wenn du das alles nicht möchtest habe ich noch 2 weiter Methoden für dich:

#include <windows.h>
#include <string.h> /* für strlen */

/* ---------------------------------- */

HWND hwnd = CreateWindowEx(...);
HFONT font = CreateFont(...);

/* ---------------------------------- */

HDC hdc;
char *msg = "Dein Text.";

/* ---------------------------------- */

hdc = GetDC(hwnd);
SelectObject(hdc, font);
SetBkColor(hdc, TRANSPARENT);
SetTextColor(hdc, RGB(255, 0, 0)); /* = rot */
/* 15 = x-Position; 50 = y-Position */
TextOut(hdc, 15, 50, msg, strlen(msg));
Wichtig für diesen Code ist, dass hwnd und font bereits mit gültigen Werten besetzt sein müssen.
hwnd ist in diesem Fall das Handle zum Fenster in dem der Text erscheinen soll und font ein Zeiger auf eine Font (= Schriftart), welcher mit CreateFont erstellt wurde.

Zweite Möglichkeit:


HWND hwnd = CreateWindowEx(...);

/* ---------------------------------- */

Static_SetText(hwnd, "Dein Text.");
Hier ist hwnd ein Handle zu einem "Static-Control".
http://msdn.microsoft.com/en-us/library/bb760769(VS.85).aspx

Weiteres:
- die Controls können selbstverständlich auch via Dialog-Ressourcen erzeugt werden - wichtig sind nur die Handles

- die Strings können uA. auch mit sprintf erzeugt werden, welches den selben Syntax wie printf benutzt.
Bsp:

char buffer[100];
int ein_int = 10;
char *ein_string = "Hello World!";

sprintf(buffer, "ein_int = %d; ein_string = '%s'", ein_int, ein_string);
Hier ist natürlich zu beachten, dass die Größe von buffer nicht überschritten wird (Buffer Overflow).


mfG. BlackBerry

nathex
21.05.2009, 21:09
Also im Prinzip ist es so:

Wenn man im Projekt den iostream nicht unbedingt braucht (oder einfach nicht benutzen möchte), kann man (um die spätere Dateigröße zu verringern) printf, bzw scanf für ein- bzw. ausgabe benutzen.
... Wenn ich das richtig verstanden hab :)

*Hätte da noch ne andere Frage. Ich weiss, dass zwischen "int main()" und "int main(void)" keinerlei unterschied liegt, allerdings frag ich mich trotzdem, was "eleganter" ist, bzw. was im professionellen Gebiet eher benutzt wird.

Thanks again :)

blackberry
21.05.2009, 21:22
In C++ ist das vollkommen gleich.
In C nicht.

In C wird bei Funktionen ohne Parameter und ohne void in der Parameterliste von einer beliebigen Parameterliste ausgegangen.
In C++ wird ein beiden Fällen (mit void und ohne void) von einer Leeren Parameterliste (= keine Parameter) ausgegangen.

Versuch mal folgenden Code als C bzw. C++ Code zu compilieren:

void f_mit_void(void)
{
/* mach 'was */
}

void f_ohne_void()
{
/* mach 'was anderes */
}

int main(void)
{
f_mit_void(); /* korrekt in C und C++ */
f_mit_void(1, 2, 3); /* falsch in C und C++ */

f_ohne_void(); /* korrekt in C und C++ */
f_ohne_void(1, 2, 3); /* falsch in C++, _ABER_ korrekt in C */
return 0;
}Eleganter finde ich also die Variante mit void, da diese klar festlegt, dass diese Funktion keine Parameter akzeptiert.
Wenn man aber sowieso Klassen benutzt und der Code demzufolge überhaupt nicht als C Code compilierbar wäre, kann einem das eigentlich egal sein. (obwohl - wenn man das schon beim C programmieren so macht - wieso sollte man es dann nicht auch einhaltlich halten?)


mfG. BlackBerry

cyber_gh0st
23.05.2009, 11:57
wobei du scanf nicht benutzen solltest weil das ziemlich anfällig ist was bufferoverflows angeht...

blackberry
23.05.2009, 12:08
Wo ist hier der BufferOverflow?


#include <stdio.h>


int f(void)
{
char buffer[20];
int n;

n = scanf("%19s", buffer);

printf("buffer = \"%s\" [%d]\n", buffer, n);
fflush(stdin);

return n;
}

int main(void)
{
f();
return 0;
}

(ich weiß, dass scanf in der Regel anfällig ist, aber dieses Beispiel soll nur zeigen, dass es nicht anfällig sein muss)

wacked
23.05.2009, 19:31
im zweifel scanfn