String- Länge
-
Hi ... nur mal eine kurze Frage zur Sicherheit:
Ich hab nen String:
char string[30];
Damit der nicht "überlang" beschrieben wird, hab ich ne Abfrage drin à la
if (strlen(string) <30) // bla blub
Ist das korrekt?
Der String Array hat die Felder string[0] bis string[29] ... wie verhält sich das mit strlen?
-
Das string-Array hat nur 30 Felder, d.h. die maximale Länge des Strings ist 29 Zeichen. strlen wird also niemals etwas größeres als 29 zurückliefern (sonst hast du schon einen Pufferüberlauf).
Deine if-Bedingung ergibt also immer true. Du brauchst if(strlen(string) < 29); denn nur solange der Puffer noch nicht bis zum Rand gefüllt ist, dürfen Zeichen hinzugefügt werden.
Programmierst du in C, oder warum nimmst du nicht std::string? Damit hättest du nämlich keine Probleme bzgl. zu wenig Speicher.
p.s.: C oder C++, das ist hier die Frage.
Denn WinAPI ist das falsche Forum.
-
OK ... Danke!!
-
SirNoname schrieb:
OK ... Danke!!
Du hat meine Frage nicht beantwortet: C oder C++?
-
Naja eigentlich schon C++ .... aber in diesem Falle C, weil ich die STL nich benutzen will ....
Außerdem hats mich mal so interessiert ^^
-
Dieser Thread wurde von Moderator/in cd9000 aus dem Forum WinAPI in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX\0 ist das längste mögliche. strlen würde 29 zurückgeben, wobei 29 doch noch erlaubt wäre oder? (das ist doch nicht zu lang)
aber es ist auch sinnlos einen höheren wert zu nehmen, da das strlen am fehlenden \0 scheitern würde.also, wenn man abfragt und es im korrekten bereich ist, funktionierts sowieso.
und wenns nicht im korrekten bereich ist, funktioniert das strlen auch nicht.mfG (c)h
-
Was für einen Sinn macht es bitteschön zu überprüfen ob man den gültigen Bereich eines Buffers bereits verlassen hat?
Wenn ich mit:
char buff[10]; gets(buff);
Einen String einlese kann ich logischerweise auch darüber hinaus schreiben. strlen() wird mir dann die Länge des strings liefern falls irgendwo im Speicher halt mal eine 0 ist.
Wenn man über einen gültigen Bereich hinaus schreibt hat man immer undefiniertes Verhalten. Also nutzen wir doch die Funktionen die uns bereits bei der Eingabe dafür sorgen, dass wir unseren Buffer nicht verlassen.
-
benutze gets nicht, damit hast du bestimmt buffer overflow, benutze stattdessen fgets, im obigen Beispiel wäre
fgets(buff,10,stdin);
-
Ähmmm, das war jetzt als Beispiel extra gets(). Schau mal in meine Signatur
Edit: Und ja, du solltest die Beiträge auch ganz lesen. Dann hättest du dir das auch denken können...
-
Deine Signatur hab ich nicht gelsen und leider hab ich deinen kompletten nicht Beitrag gelsen, geb ich zu, hab nur das gets gesehen und meine Augen haben dann wehgetan und dann schnell gepostst, nicht dass SirNoname denkt, man sollte es benutzen. War nur nett gemeint.