2012-06-25 4 views
31

ich nicht ganz sicher bin, wie dies in C zu tun:C - Split String in ein Array von Strings

char* curToken = strtok(string, ";"); 
//curToken = "ls -l" we will say 
//I need a array of strings containing "ls", "-l", and NULL for execvp() 

Wie würde ich über das tun dies gehen?

+4

Wenn Sie basierend auf Leerzeichen aufteilen möchten, warum haben Sie ';' als Trennzeichen angegeben? –

+2

Zum Beispiel: string = "ls -l; datum; set + v" – Jordan

Antwort

49

Da Sie bereits in strtok geschaut haben weiterhin nur den gleichen Weg nach unten und teilen Sie Ihre String-Raum mit (' ') als Trennzeichen, so etwas wie realloc verwenden, um die Größe des Arrays zu erhöhen, die Elemente enthält, übergeben werden execvp.

Siehe das folgende Beispiel, aber bedenken Sie, dass strtok die an ihn übergebene Zeichenfolge ändert. Wenn Sie dies nicht möchten, müssen Sie eine Kopie der ursprünglichen Zeichenfolge erstellen, indem Sie strcpy oder eine ähnliche Funktion verwenden.

char str[]= "ls -l"; 
char ** res = NULL; 
char * p = strtok (str, " "); 
int n_spaces = 0, i; 


/* split string and append tokens to 'res' */ 

while (p) { 
    res = realloc (res, sizeof (char*) * ++n_spaces); 

    if (res == NULL) 
    exit (-1); /* memory allocation failed */ 

    res[n_spaces-1] = p; 

    p = strtok (NULL, " "); 
} 

/* realloc one extra element for the last NULL */ 

res = realloc (res, sizeof (char*) * (n_spaces+1)); 
res[n_spaces] = 0; 

/* print the result */ 

for (i = 0; i < (n_spaces+1); ++i) 
    printf ("res[%d] = %s\n", i, res[i]); 

/* free the memory allocated */ 

free (res); 

res[0] = ls 
res[1] = -l 
res[2] = (null) 
+1

@JordanCarney freut sich, Ihnen behilflich zu sein. –

+0

@ FilipRoséen-refp Können Sie den letzten Codeblock vor dem Drucken erklären und den Speicher freigeben, das: '/ * Realloc ein zusätzliches Element für die letzte NULL * /'? Ich habe Schwierigkeiten, es zu verstehen – Abdul

+0

@Abdul Ich glaube normalerweise gibt es ein Nullzeichen am Ende jedes Arrays, so dass der Computer zwischen zwei verschiedenen Arrays unterscheiden kann. – Charles

6

Here is an example of how to use strtok von MSDN entlehnt.

Und die relevanten Bits, müssen Sie es mehrmals aufrufen. Die token Char * ist der Teil, den Sie in ein Array stopfen würden (Sie können diesen Teil herausfinden).

char string[] = "A string\tof ,,tokens\nand some more tokens"; 
char seps[] = " ,\t\n"; 
char *token; 

int main(void) 
{ 
    printf("Tokens:\n"); 
    /* Establish string and get the first token: */ 
    token = strtok(string, seps); 
    while(token != NULL) 
    { 
     /* While there are tokens in "string" */ 
     printf(" %s\n", token); 
     /* Get next token: */ 
     token = strtok(NULL, seps); 
    } 
} 
+0

Ich verstehe so viel, aber das gibt mir nicht eine Reihe von Zeichenfolgen aus den Token. Ich denke, ich verstehe diesen Teil nicht. – Jordan

+0

Warum 'token = strtok (NULL, seps);'? Warum die 'NULL'? – Charles

+0

@ c650 Siehe die verknüpfte Seite von MSDN, nachfolgende Aufrufe benötigen die 'NULL'. –