Advanced C Code

From C4 Wiki
Jump to: navigation, search

webfs/request.c:

h = filename -1 +sprintf(filename,"%s%s%s%s",
    do_chroot ? "" : doc_root,
    virtualhosts ? "/" : "",
    virtualhosts ? req->hostname : "",
    req->path);

RobotNik kapiert das ueberhaupt nicht. Please help!



Wo ist das Problem?

  • sprintf baut einen neuen filename zusammen und gibt die Länge des strings zurück (int). Zu beachten: '\0' wird mitgezählt!.
    (Beispiel: filename = "ha\0": sprintf gibt 3 zurück)
  • filename muss reserviert sein, bevor es an sprintf übergeben wird. Es ist also ein char* mit fester Adresse. h ist wohl auch ein char*.
  • Addiert man nun die Adresse von filename (char*) mit der Länge von filename (int), nachdem dieser von sprintf gefüllt wurde, zieht 1 ab, so erhält man den String h. Dieser ist ein Pointer auf das Ende des Strings filename. Er zeigt genau auf den Terminator ('\0') von filename. (Beispiel: filename zeigt auf den String "ha\0" und hat die Adresse 2. Dann: h = 2(filename) -1 + 3(länge von filename,sprintf) = 4 = '\0' (oder filename[2])

Wozu man h nun brauch, weiss ich auch nicht. Es gibt schliesslich strcat.

strcat muss aber den gesamten string lesen, bis es am Terminator angekommen ist. Wenn man den Zeiger auf das Ende umsonst (naja, eine Addition zur Laufzeit) bekommt, ist das schon praktisch. --is

Hoffe man kann das jetzt verstehen. Glaube irgendwie, dass es noch ziemlich verwirrend ist. --MichaelRKoellejan



In einer lesbaren Sprache:

filename = 
if not do_chroot:
    filename += doc_root
if virtualhosts:
    filename += '/' + req.hostname
filename += req.path 
# naja, nicht wirklich vergleichbar:
h = filename[-1]

--DoobeeRTzeck



ARGH! Ja, es ist absolut klar. Wer lesen kann ist klar im Vorteil. Ich habe seltsamerweise gestern in der .{0,2}printf manpage gelesen, dass sprintf() ein char * liefert. *Was* es machte war mir klar, gdb ist mein Freund :) --RobotNik