Okay, ich habe es geschaft
ich musste meine teilen()-Funktion ändern. ![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
Hier mein Code:
Danke für eure Hilfe![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)
Hier mein Code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_PAARE 255
#define BUF 255
struct CGI_DATEN {
char *variable;
char *wert;
struct CGI_DATEN *next;
};
struct CGI_DATEN *ende = NULL;
char *Strdub(char *str) {
char *puffer = (char *)malloc(strlen(str)+1);
if(puffer == NULL)
return NULL;
strcpy(puffer, str);
return puffer;
}
char *getdata(void) {
char *methode = getenv("REQUEST_METHOD");
char *puffer;
char *str, *cont_len;
int size;
if(methode == NULL)
return NULL;
else if(strcmp(methode, "GET") == 0) {
str = getenv("QUERY_STRING");
if(str == NULL)
return NULL;
puffer = Strdub(str);
if(puffer == NULL)
return NULL;
return puffer;
} else if(strcmp(methode, "POST") == 0) {
cont_len = getenv("CONTET_LENGTH");
if(cont_len == NULL)
return NULL;
size = (int) atoi(cont_len);
if(size <= 0)
return NULL;
puffer = (char *)malloc(size+1);
if(puffer == NULL)
return NULL;
if(NULL == fgets(puffer, size+1, stdin)){
free(puffer);
return NULL;
}
return puffer;
}else
return NULL;
}
struct CGI_DATEN *teilen(char *str) {
char *paare[MAX_PAARE];
char *s, *res;
int i=0, j=0;
struct CGI_DATEN *ptr_anfang = NULL;
struct CGI_DATEN *ptr_daten = NULL;
s = str;
res = strtok(s, "&");
while(res != NULL && i < MAX_PAARE) {
paare[i] = (char *) malloc(strlen(res)+1);
if(paare[i] == NULL)
return NULL;
strcpy(paare[i], res);
res = strtok(NULL, "&");
i++;
}
while(j < i) {
if(ptr_anfang == NULL) {
ptr_anfang = (struct CGI_DATEN *) malloc(sizeof(struct CGU_DATEN *));
if(ptr_anfang == NULL)
return NULL;
res = strtok(paare[j], "=");
ptr_anfang->variable = (char *) malloc(strlen(res)+1);
if(ptr_anfang->variable == NULL)
return NULL;
strcpy(ptr_anfang->variable, res);
res = strtok(NULL, "\0");
if(res != NULL) {
ptr_anfang->wert = (char *) malloc(strlen(res)+1);
if(ptr_anfang->wert == NULL)
return NULL;
strcpy(ptr_anfang->wert, res);
} else {
ptr_anfang->wert = (char *) malloc(strlen("")+1);
if(ptr_anfang->wert == NULL)
return NULL;
strcpy(ptr_anfang->wert, "");
}
ptr_anfang->next = (struct CGI_DATEN *) malloc(sizeof(struct CGI_DATEN *));
if(ptr_anfang->next == NULL)
return NULL;
ptr_daten = ptr_anfang->next;
j++;
} else {
res = strtok(paare[j], "=");
ptr_daten->variable = (char *) malloc(strlen(res)+1);
if(ptr_daten->variable == NULL)
return NULL;
strcpy(ptr_daten->variable, res);
res = strtok(NULL, "\0");
if(res != NULL) {
ptr_daten->wert = (char *) malloc(strlen(res)+1);
if(ptr_daten->wert == NULL)
return NULL;
strcpy(ptr_daten->wert, res);
} else {
ptr_daten->wert = (char *) malloc(strlen("")+1);
if(ptr_daten->wert == NULL)
return NULL;
strcpy(ptr_daten->wert, "");
}
ptr_daten->next = (struct CGI_DATEN *) malloc(sizeof(struct CGI_DATEN *));
if(ptr_daten->next == NULL)
return NULL;
ptr_daten = ptr_daten->next;
j++;
}
}
ende = ptr_daten;
return ptr_anfang;
}
char convert(char *hex) {
char ascii;
/* erster Hexawert */
ascii =
(hex[0] >= 'A' ? ((hex[0] & 0xdf) - 'A')+10 : (hex[0] - '0'));
ascii <<= 4; /* Bitverschiebung schneller als ascii*=16 */
/* zweiter Hexawert */
ascii +=
(hex[1] >= 'A' ? ((hex[1] & 0xdf) - 'A')+10 : (hex[1] - '0'));
return ascii;
}
void hex2ascii(char *str) {
int x, y;
for(x=0,y=0; str[y] != '\0'; ++x,++y) {
str[x] = str[y];
/* Ein hexadezimales Zeichen ? */
if(str[x] == '%') {
str[x] = convert(&str[y+1]);
y += 2;
}
/* Ein Leerzeichen ? */
else if( str[x] == '+')
str[x]=' ';
}
/* geparsten String sauber terminieren */
str[x] = '\0';
}
int main(void) {
printf("Content-Type: text/html\n\n");
struct CGI_DATEN *zeiger;
char *str = getdata();
if(str == NULL) {
printf("Fehler bei str");
return EXIT_FAILURE;
}
hex2ascii(str);
zeiger = teilen(str);
if(zeiger == NULL) {
printf("Fehler bei teilen()");
return EXIT_FAILURE;
}
printf("%s : %s", zeiger->variable, zeiger->wert);
zeiger = zeiger->next;
printf("%s : %s", zeiger->variable, zeiger->wert);
zeiger = zeiger->next;
printf("%s : %s", zeiger->variable, zeiger->wert);
zeiger = zeiger->next;
printf("%s : %s", zeiger->variable, zeiger->wert);
zeiger = zeiger->next;
return EXIT_SUCCESS;
}
Danke für eure Hilfe
![Smile :) :)](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f642.png)