String Tokenizer, welcher delimiters behält?



  • Ich suche nach einer möglichst einfachen und effektiven Weise, um einen String zu parsen, die delimiter als Zeichen aber ebenso als token rückgeliefert zu bekommen.
    Ist das vernünftig lösbar, ohne gleich den ganzen Tokenizer neu zu schreiben?



  • Hi!
    Habs mal programmiert, wenn man die Aufgabe durch Zusammenstepseln von Biblothekstfunktionen
    erledigt, ist der zusätzliche Programmieraufwand eh kaum kleiner.

    #include <stdio.h>  
    #include <string.h> 
    
    char* myparser(char* str)
    {
       static char* res;
       static char buf[256];                  // maximale tokensize hier 255
       char delimiter[] = {32, 9, 10, 13, 0}; // beliebig veränderbar, nullterminiert!
       int a;
       if (res == 0) res = str; // s.u.
    
       for (a = 0; *res; a++){
          buf[a] = *res;
          res++;      
          for (int i = 0; delimiter[i]; i++){
             if (buf[a] == delimiter[i] && a > 0){               
                res--;
                buf[a] = 0;
                return buf;
             }
             if (buf[a] == delimiter[i] && a == 0){
                buf[a] = delimiter[i];
                buf[a+1] = 0;
                return buf;
             }
          }
       }
       if (!*res && a)
          return buf;
       res = 0;    // Erst wenn die abschliessende Null des zu parsenden Strings erreicht
       return res; // ist, gibt die Funktion Null zurück und kann wieder neu
    }              // für einen anderen String verwendet werden.  
    
    int main()
    {
       char f[30][10]; 
       char* tmpPtr;
       char str[] = "Dies ist ein Test ...test \t \n t test \t \n"; 
    
       for (int i = 0; true; i++){
    
          tmpPtr = myparser(str);
    
          if (!tmpPtr) break;
    
          printf(strcpy(&f[i][0], tmpPtr)); printf("\n");
       }
    }
    

    mfg



  • Ich muß mir den code noch genauer anschauen, aber hab vielen Dank für Deine Mühe, es wird mir sicher weiterhelfen!


Anmelden zum Antworten