fgets Parameter
-
Hallo zusammen,
nachdem mich nun das große Interesse an C/C++ gepackt hat, habe ich mich mit Büchern eingedeckt und bin kräftig am Lernen. Soweit läuft es auch ganz gut, allerdings hätte ich jetzt doch mal eine Frage an die Experten hier im Forum.
Es geht um die Funktion 'fgets':
Dieser Funktion muß man ja die Länge/Größe der einzulesenden Daten angeben.
Also z.b. entweder:
char meinspeicher[100]; . . fgets(meinspeicher, sizeof(meinspeicher), stream);
oder:
#define MAX_SPEICHER 100; . . char meinspeicher[MAX_SPEICHER]; . . fgets(meinspeicher, MAX_SPEICHER, stream);
Wie würdet Ihr das machen. Die 'sizeof' Version scheint mir die bessere (?) zu sein.
Vielen Dank schonmal im Voraus.
Grüße Netzschleicher
-
Hier ist sizeof sicher besser, da ja der Fall eintreten kann, dass du doch mal einen anderen Wert als MAX_SPEICHER für die Array-Größe nimmst. Mit sizeof beziehst du dich aber immer auf genau das Array, macht also imho mehr Sinn.
-
Spitze, Danke.
Dann lag ich mit meinem Gedanken das mit sizeof auf jeden Fall sozusagen nichts passieren kann richtig.
-
Ein bisschen aufpassen musst du schon. Wenn du zum Beispiel dein fgets in eine Funktion auslagerst.
char meinspeicher[100]; void holeEingabe(char array[]){ fgets(array, sizeof array, stdin); } int main(){ holeEingabe(meinspeicher); return; }
Hier funktioniert sizeof nicht wie erwartet. In der Funktion weiß sizeof nicht welches array du übergeben wirst, damit ist sizeof array die Länge des Arraypointers, also 4 oder 8 und nicht 100.
-
nwp2 schrieb:
Hier funktioniert sizeof nicht wie erwartet. In der Funktion weiß sizeof nicht welches array du übergeben wirst...
richtig, ein vorteil der #define-variante ist, dass man sich an allen stellen die übergabe der array-grösse sparen kann. für globale, feste arrays ist #define eigentlich das beste.
-
;fricky schrieb:
nwp2 schrieb:
Hier funktioniert sizeof nicht wie erwartet. In der Funktion weiß sizeof nicht welches array du übergeben wirst...
richtig, ein vorteil der #define-variante ist, dass man sich an allen stellen die übergabe der array-grösse sparen kann. für globale, feste arrays ist #define eigentlich das beste.
Nö, ich würde eher sagen, wenn man schon Funktionen definiert, dann sollten die auch mit mehr als einem ganz speziellen, fixen Array zurechtkommen (Wiederverwendbarkeit). Und die logische Folge ist, dass diese Funktionen die Array-Größe als Parameter entgegennehmen (und das kann dann wieder sizeof oder so sein).
-
_matze schrieb:
ich würde eher sagen, wenn man schon Funktionen definiert, dann sollten die auch mit mehr als einem ganz speziellen, fixen Array zurechtkommen (Wiederverwendbarkeit). Und die logische Folge ist, dass diese Funktionen die Array-Größe als Parameter entgegennehmen (und das kann dann wieder sizeof oder so sein).
^^ das schliesst sich ja nicht gegenseitig aus.
... f (array, sizeof(array)); ... f (global_array, GLOBAL_ARRAY_SIZE); ...
nur haste noch den vorteil, dass überall wo global_array direkt benutzt wird, die grösse schon bekannt ist.
-
Hallo,
tja, ich sehe schon, es gibt noch viel zu lernen bzw. zu beachten. Auf jeden Fall vielen Dank für die netten Antworten.
nwp2 hat natürlich Recht, wenn ich das Array einer Funktion übergebe, erhält diese ja nur den Pointer(Zeiger) auf das Array im Speicher. Und Zeiger haben eben eine Größe von 4 Byte (bei meinem System).
Hab das mal schnell so in einem kleinen Progrämmchen nachvollzogen.
Zur Sicherheit sollt ich dann doch einer solchen Funktion noch die eigentliche Größe als weiteren Parameter mit übergeben, wie ;fricky vorgeschlagen hat.Grüße Netzschleicher