PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gets() vs fgets()



cybercrow
27-11-2001, 19:39
Hi,
ich bin gerade dabei C zu lernen. In meinem Buch wird zum einlesen von strings die Funktion gets() verwendet. Wenn ich diese Beispiele compilieren bringt mir der compiler eine Warnung das man gets() nicht verwenden sollte. 'man gets' sagt das man an der stelle von gets fgets verwenden soll. Kann mir mal einer eine kurzes Beispiel zu fgets zeigen? fgets braucht ja irgendwie mehr optionen als gets, bin aber nicht richtig dahinter gekommen wie ich das umsetzen muss.
Also gets() wird in meinem Buch so verwendet:

int main()
{
char satz[80];

printf("Satz eingeben: ");
gets(satz);

return 0;
}

Wie müsste das jetzt mit fgets() aussehen?

Und dann nochwas. Warum man gets() nicht verwenden soll wird in den manpages so erklärt:
Da es unmöglich ist zu sagen, wie viele Zeichen
gets() lesen wird, ohne die Daten vorher zu kennen und da
gets() fortfährt und Daten über das Ende des Puffers hin*
aus speichert, ist es sehr gefährlich, diese Funktion zu
benutzen. Sie wurde benutzt um in Rechner einzubrechen.
Benutze fgets() anstatt.

Kennt sich damit einer genauer aus. Wo gneau liegt denn die Gefahr in gets() ??? Wie soll man damit ein einen Rechner einbrechen können ??

Danke!

anda_skoa
27-11-2001, 20:24
Original geschrieben von cybercrow
Kann mir mal einer eine kurzes Beispiel zu fgets zeigen? fgets braucht ja irgendwie mehr optionen als gets, bin aber nicht richtig dahinter gekommen wie ich das umsetzen muss.


Kein Problem :)



#include <stdio.h>

int main()
{
char satz[80];

printf("Satz eingeben: ");
fgets(&satz, 80, stdin);

return 0;
}

stdin ist der Standard Inputstream (der FILE* parameter in der Beschreibung)



Und dann nochwas. Warum man gets() nicht verwenden soll wird in den manpages so erklärt:
Da es unmöglich ist zu sagen, wie viele Zeichen
gets() lesen wird, ohne die Daten vorher zu kennen und da
gets() fortfährt und Daten über das Ende des Puffers hin*
aus speichert, ist es sehr gefährlich, diese Funktion zu
benutzen. Sie wurde benutzt um in Rechner einzubrechen.
Benutze fgets() anstatt.
Kennt sich damit einer genauer aus. Wo gneau liegt denn die Gefahr in gets() ??? Wie soll man damit ein einen Rechner einbrechen können ??


Wenn man mehr Zeichen eingibt, als Platz haben, werden die in den Speicher "dahinter" geschrieben. Wenn die dorthingeschrieben Daten gültiger Code des Computers ist, dann braucht nur irgendwie dort hingesprungen zu werden, um den code auszuführen.

Wenn man lange genug dahinter reinschreibt, kommt man eventuell dorthin, wo eine Rücksprungstelle ist, oder ähnliches.
Wird dann im Programmverlauf diese Adresse zu Exektuon benutzt, wird der eingeschuggelte Code ausgeführt.

(oder so in etwas, bin da kein experte, hab mir das mal erklären lassen)

Ciao,
_

tkortkamp
27-11-2001, 20:32
Hallo!
Das müsste so aussehen:

#include <stdio.h>

int main()
{
char satz[80];

printf("Satz eingeben: ");
fgets(satz, sizeof(satz), stdin);

return 0;
}

sizeof(satz) gibt fgets die Größe des Puffers, damit nichts zu viel eingegeben wird.
stdin ist die Standard-Eingabe.


cya,
Tobias

anda_skoa
27-11-2001, 21:35
Du hast Recht, mit sizeof() ist es noch besser.

Sieht man wieder, dass man jedes noch so kurze Stück Code verbessern kann :p

Ciao,
_