[C/C++] mit getline() erzeugten String zerlegen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Leon, 3. Mai 2009 .

Schlagworte:
  1. 3. Mai 2009
    mit getline() erzeugten String zerlegen

    Hallo,

    habe mir mit getline und folgendem Code einen Zeiger auf ein dynamisch langen String erzeugt, den ich auch ausgeben kann. Nun möchte ich diesen String gerne für Auswertungszwecke zerlegen z.B. einzelne darin enthaltene Worte abspeichern. Die Frage ist nun, wie mach ich das am besten?
    Ausgeben ist, wie man sieht schonmal kein Problem

    Hier mal der Source Code:

    Code:
    int main(void) {
     FILE *fd;
     char *datei = "testdatei.txt";
     int nRet;
     size_t *t = malloc(0);
     char **gptr = (char **)malloc(sizeof(char*));
     *gptr = NULL;
     if ( (fd = fopen(datei,"r")) == NULL) {
     fprintf(stderr, "\nKonnte Datei %s nicht öffnen!", datei);
     return EXIT_FAILURE;
     }
     while( (nRet=getline(gptr, t, fd)) > 0)
     { 
     fputs(*gptr,stdout); 
     } 
    return EXIT_SUCCESS;
    }
     
  2. 3. Mai 2009
    AW: mit getline() erzeugten String zerlegen

    Wenn du ein Trennmuster hast, dann kannst du das ganze mit strtok/strchr erledigen.
     
  3. 3. Mai 2009
    ah, danke bin jetzt auch auf strtok gekommen, werd damit mal ein bisschen arbeiten und schauen was dabei rauskommt

    Sooo, habs jetzt mit strtok() hinbekommen.
    Nun hab ich aber folgendes Problem: Meine Textdatei liegt in ASCII vor.
    Das heißt wenn ich z.B.
    Code:
     ptr = strtok(*gptr, " \n-,!");
    eingebe, werden nur die Leerzeichen als token anerkannt, den Rest erkennt er nicht, da es wahrscheinlich eine Kollision mit den ASCII Codes gibt.
    Wie kann ich die ASCII Codes in den string hauen?
     
  4. 6. Mai 2009
    AW: mit getline() erzeugten String zerlegen

    strtok() ist ASCII-Konform, und sollte diese Zeichen erkennen. Bist du dir sicher, dass im Text auch diese Zeichen vorkommen?

    Hast du, um den gleichen String nochmals zu bearbeiten, den ersten Parameter auch an stelle des Strings eine NULL übergeben?

    Hier ein kleiner Test von mir, der auch wunderbar läuft:

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main( void )
    {
     const char delim[] = " \n-,!";
     char str[] = "Das ist nur ein kleiner Test,\nzur Überprüfung von strtok()!";
     char *tok = strtok (str, delim);
    
     while (tok != NULL)
     {
     printf ("%s\n", tok);
     tok = strtok (NULL, delim);
     }
    
     return 0;
    }
    
     
  5. 6. Mai 2009
    AW: mit getline() erzeugten String zerlegen

    Fehler meinerseits
    Hab vergessen die delimeters auch im 2. Aufruf zu benutzen
     
  6. 9. Oktober 2009
    AW: mit getline() erzeugten String zerlegen

    hallo,
    ich bekomme "error: invalid initializer" bei char str[] = strg; wenn ich die funktion so verändere:
    kann mir jemand behilflich sein? danke!

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main( void )
    {
     const char* strg = "Das ist nur ein kleiner Test,\nzur Überprüfung von strtok()!";
     const char delim[] = " \n-,!";
     char str[] = strg;
     char *tok = strtok (str, delim);
    
     while (tok != NULL)
     {
     printf ("%s\n", tok);
     tok = strtok (NULL, delim);
     }
    
     return 0;
    }
    
     
  7. 9. Oktober 2009
    AW: mit getline() erzeugten String zerlegen

    Das was du da vorhast wirt auch nicht gehen.
    Um auf einen anderen String zu verweisen (Auch wenn sich der Inhalt dessen ändert), dann benötigst du einen Zeiger:

    char *str = (char*)strg;
     
  8. 10. Oktober 2009
    AW: mit getline() erzeugten String zerlegen

    Danke, es funktioniert jetzt:
    char* str = strg;
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.