Hallo mal wieder
Offen gesagt, finde ich Deine Loesung nich besonders toll.
Von der Logik her kommt das Programm nicht damit zurecht, wenn die Parameter im Query string in einer anderen als der erwarteten Reihenfolge uebergeben werden. Wenn die Daten von einem Formular aus abgeschickt werden, ist das vom Browser abhaengig.
Da z1 nirgendswo initialisiert wird, hat es beim ersten Durchlauf von translate() einen zufaelligen Wert. Der Zugriff
»» while ( string[z1] != '=' )
kann daher eine der von Dir so geliebten Schutzverletzungen hervorrufen.
Wenn der Querystring kein = enthaelt, wird an eben dieser Stelle endlos weitergesucht -> Schutzverletzung.
In translate() wird von string[z1] nach var[z3] kopiert, aber keine abschliessende Null geschrieben. Der darauffolgende strcpy()-Aufruf wird dann bis irgendwohin kopieren, wo zufaellig wieder eine Null steht. Wenn nicht zufaellig irgendwann eine kommt (sehr unwahrscheinlich), gibt es eine Schutzverletzung. Wenn doch irgendwann eine kommt, hast Du bis dahin wahrscheinlich schon die Haelfte Deiner Variablen ueberschrieben. Daher immer die abschliessende Null am Stringende schreiben.
Wenn die Daten die Laengen Deiner vordefinierten Arrays uebersteigen, werden im besten Falle andere Variablen ueberschrieben (z.B. wenn einer bei Name 20 Zeichen eingibt).
Die Arrays send[] und content[] werden nirgendwo (sinnvoll) benutzt.
Am Anfang ziehst Du Speicher fuer 'string', schmeisst den Pointer auf den erhaltenen Speicher aber gleich danach wieder weg, wenn Du das Ergebnis von getenv() zuweist. Du wirst diesen Speicher nie wieder freigeben koennen (was Du ohnehin versaeumt hast) und hast damit ein Memory leak. Du kannst das als Kleinigkeit abtun, aber Tatsache ist, dass viele grosse Programme (z.B. der Netscape Navigator) aus genau diesem Grund Unmengen von Speicher vom System beanspruchen, ohne ihn zu brauchen.
Anbei eine korrigierte Version. Hab's nicht komplett getestet, sollte aber so ungefaehr laufen. Das Problem mit der Reihenfolge der Parameter ist da jedoch nicht geloest.
Calocybe
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
char name[15], vorname[15], email[35], homepage[60], kommentar[500];
char var[500];
char* string;
int z1, z3; //Zaehlervariablen
void translate();
int ausgabe();
int main() {
string = getenv("QUERY_STRING");
if (!string) {
printf ("Content-Type: text/html\n\n");//header
printf ("<html><body>Bitte geben sie die Daten erneut ein!</body></html>");
return 0;
}
z1 = 0;
translate(15);
strcpy(name,var);
translate(15);
strcpy(vorname,var);
translate(35);
strcpy(email,var);
translate(60);
strcpy(homepage,var);
translate();
strcpy(kommentar,var);
ausgabe();
return 0;
}
/* maxlength ist die Groesse des Zielarrays, in das hinterher mit strcpy() hineinkopiert wird */
void translate(int maxlength) {
var[0] = '\0';
while ((string[z1] != '=') && (string[z1] != '\0'))
z1++;
if (!string[z1]) return; /* falls kein = mehr da war, wegen '\0' rausgeflogen */
z1++;
if (maxlength > 500)
maxlength = 500; /* darf natuerlich auch die Laenge von var[] nicht ueberschreiten */
z3 = 0;
while ((string[z1] != '&') && (string[z1] != '\0') && (z3 < maxlength-1))
var[z3++] = string[z1++];
var[z3] = '\0'; /* String muss abgeschlossen werden, sonst macht strcpy() Mist */
/* falls wegen maxlength-ueberschreitung rausgeflogen, noch bis zum naechsten '&' aufschliessen */
while ((string[z1] != '&') && (string[z1] != '\0')) z1++;
}
int ausgabe() {
printf ("Content-Type: text/html\n\n");//header
printf("<html><head><title>Temporärest Gaestebuch</title></head>");
printf("<body>");
printf("Name: %s<br>",name);
printf("Vorname: %s<br>",vorname);
printf("E-Mail: <a href=mailto:%s>%s</a><br>",email, email);
printf("Homepage: %s<br>",homepage);
printf("Kommentar: %s<br>",kommentar);
printf("</body></html>");
return 0;
}