Difference between revisions of "Advanced C Code"
Mario Manno (talk | contribs) (added categories) |
|||
Line 16: | Line 16: | ||
* 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]) | * 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 | + | 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 | ||
---- | ---- | ||
<br /> | <br /> |
Latest revision as of 12:03, 2 December 2004
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