CGI/HTML Leeres Textfeld

Okay, ich habe es geschaft :) ich musste meine teilen()-Funktion ändern. :)

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 :)
 
Zurück