Difference between revisions of "Advanced C Code"

From C4 Wiki
Jump to: navigation, search
 
 
(One intermediate revision by one other user not shown)
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 />
Line 34: Line 38:
 
<br />
 
<br />
 
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
 
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
 +
 +
[[Category:Code]][[Category:Hacks]]

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