[C/C++] [SOLVED] strtok nightmare ^^

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von 010100111001, 1. November 2011 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 1. November 2011
    [SOLVED] strtok nightmare ^^

    Bei meinem Code verhält sich aus mir nicht ersichtlichen Gründen strtok unterschiedlich, je nachdem, ob ich als Trennzeichen " " oder "." verwende.

    Der "." als Trennzeichen führt zu von mir erwartetem Verhalten:
    Ausgabe der einzelnen Tokens, jeweils in einer neuen Zeile.

    Wähle ich hingehen " " als Trennzeichen, wird jeweils nur der erste strtok-Aufruf zu einem Token ausgewertet, alle folgenden (bzw. der folgende) in der while-Schleife werden offensichtlich zu NULL ausgewertet. Somit wird der erste Token von dem String input entfernt und die äußerste Schleife startet hiermit neu. Die Frage ist: WARUM?

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <pwd.h>
    
    int main(int argc, char *argv[]) 
    {
     
     // main loop, waiting for command
     char input[1024];
     do 
     {
     //build promt
     struct passwd *passwd; 
     passwd = getpwuid(getuid()); 
     char hostname[128];
     gethostname(hostname, sizeof hostname); 
     char path[FILENAME_MAX];
     getcwd(path, sizeof(path));
     printf("\n%s@%s %s > ", passwd->pw_name, hostname, path);
    
     //read command
     scanf ("%s", input);
     int command = 0;
     char* token;
     char delim[] = " ";
     if (!strcmp(input, "exit")) command = 1;
     if (!strcmp(input, "pwd")) command = 2;
     if (!strcmp(input, "clear")) command = 3;
     switch (command) 
     {
     case 1: break;
     case 2: printf("%s", getcwd(path, sizeof(path)));break;
     case 3: system("clear");break;
     default: token = strtok(input, delim); 
     while (token)
     {
     printf("%s\n", token);
     token = strtok(NULL, delim);
     } 
     break;
     
     }
     }
     while (strcmp(input, "exit"));
    
     exit(0); 
    }


    Zur Veranschaulichung:

    Wenn ich ",. " als Trennzeichen angebe, bekomme ich folgende Ausgabe:

    d, e und f sollten anschaulich mit den anderen Buchstaben in einer Linie stehen.

    Die Shell ist die meiner Anwendung, nicht die des Hostsystems.



    ----> FGETS !!
     
  2. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.