Advanced C Code

From C4 Wiki
Revision as of 01:28, 19 October 2004 by Mario Manno (talk | contribs) (added categories)
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. 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