Christoph: C-String teilen

Beitrag lesen

Moin.

Ich hoffe mal, du kannst garantieren, dass die Länge deiner Daten die hardcodierten Feldbreiten nie überschreiten...

Verwende besser eine Funktion, die Strings beliebiger Länge 'splitten' kann. Ich habe sowas tatsächlich bei mir rumfliegen, für Bug-Freiheit übernehme ich allerdings keine Garantie ;)

  
#include <stdlib.h>  
#include <string.h>  
  
char ** strsplit(const char * input, char sep, size_t max_tokens)  
{  
 char ** tokens = NULL;  
 char * str = NULL;  
  
 tokens = malloc(sizeof(char *) * (max_tokens + 1));  
 if(!tokens) goto failed;  
  
 size_t size = strlen(input) + 1;  
  
 str = malloc(size);  
 if(!str) goto failed;  
  
 memcpy(str, input, size);  
 tokens[0] = str;  
 char ** current = &tokens[1];  
  
 for(; *str; ++str)  
 {  
  if(*str != sep) continue;  
  if(!--max_tokens) break;  
  *str = '\0';  
  *current++ = str + 1;  
 }  
 *current++ = NULL;  
  
 tokens = realloc(tokens, (char *)current - (char *)tokens);  
 if(!tokens) goto failed;  
  
 return tokens;  
  
 failed:  
 if(tokens) free(tokens);  
 if(str) free(str);  
 return NULL;  
}  

Die Funktion gibt ein Array von char* auf die einzelnen Teilstrings zurück, im Fehlerfall NULL. Der letzte Array-Eintrag ist stets NULL.

Christoph