PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : statt gets() gets_s() verwenden, String einlesen



darxun
16-03-2008, 18:09
Wie kann ich mit folgendem Code einen String einlesen?


if (gets_s(szString, BUFFSIZE) == NULL) {
printf("diagnosed undefined behavior.\n");
abort();
}

Wenn ich gets() verwende beschwert sich XCode dass diese Funktion zu unsicher ist. Das Compilieren klappt dann auch nicht. Ich habe den BUFFSIZE auf 500 definiert. Wenn ich gets_s() als Alternative zu gets() wie dargestellt verwende, dann kommt die Meldung: "warning: comparison between pointer and integer" damit kann ich allerdings nichts anfangen?
Was tun?

Greetz

PS.: die Verwendung von gets_s() hab ich hierher:
https://buildsecurityin.us-cert.gov/daisy/bsi/articles/knowledge/coding/300.html

BLUESCREEN3D
16-03-2008, 19:19
Wenn ich gets_s() als Alternative zu gets() wie dargestellt verwende, dann kommt die Meldung: "warning: comparison between pointer and integer"
Die Zeile enthält nur einen Vergleich, nämlich das ==.
Deshalb vermute ich, dass NULL nicht als Zeiger definiert ist, sondern einfach als 0.
Programmierst du in C oder in C++?

darxun
16-03-2008, 19:40
Ich programmier in C. Aber so ganz verstehe ich nicht was du meinst.

peschmae
16-03-2008, 21:25
Naja "NULL" ist ja nicht magisch oder so. In irgend einem Header ist ein Makro definiert mit Namen NULL.

Nun ist das in deinem Falle wohl ein

#define NULL 0
also der Integer-Wert 0 anstelle eines Nullpointers à la

#define NULL ( (void*)0)
oder so ähnlich...

MfG Peschmä, der schon immer gegen die Verwendung von NULL war...

ContainerDriver
16-03-2008, 22:09
MfG Peschmä, der schon immer gegen die Verwendung von NULL war...

Was verwendest du dann alternativ, bzw. was wäre dann die Alternative?

peschmae
16-03-2008, 23:54
0 halt. Mein GCC meckert eh nie deswegen. Und ich finds auch leserlicher... ;) (Jawoll!)

Wobei das im aktuellen Falle mit Compiler der deswegen meckert ein sonderlich schlechter Rat ist *g*

MfG Peschmä

darxun
17-03-2008, 08:16
Ja...ok, mein Problem ist damit nicht gelöst oder? Hab ich was übersehen?

BLUESCREEN3D
17-03-2008, 12:13
Probier mal in obigem Quellcode folgendes:

... == (char *) NULL

anda_skoa
17-03-2008, 13:02
Oder fgets() benutzen

Das ist immerhin ISO C Standard, während ich zu gets_s keine Manpage gefunden habe

Ciao,
_

locus vivendi
17-03-2008, 19:55
Oder fgets() benutzen

Das ist immerhin ISO C Standard, während ich zu gets_s keine Manpage gefunden habe
Zu gets_s gibt es tatsächlich ein offizielles Dokument. Diese Funktion stammt aus einem Technical Report für C, der für einige Funktionen der C Standardbibliothek sichere Alternativen vorschlägt.
Hier ist ein Entwurf für den TR: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1172.pdf
Auch dort wird darauf hingewiesen, die Benutzung von fgets zu erwägen.