2012-06-25 24 views
31

nie jestem całkowicie pewien, jak to zrobić w C:C - podzielonego ciąg do tablicy ciągów

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

Jak bym za to zabrać?

+4

Jeśli chcesz podzielić na podstawie spacji, dlaczego określono ';' jako ogranicznik? –

+2

Na przykład: String = "ls -l; data SET + v" – Jordan

Odpowiedz

49

Skoro już spojrzał strtok tylko nadal w dół tą samą drogą i podzielić ciąg używając przestrzeni (' ') jako ogranicznik, a następnie użyć coś jak realloc aby zwiększyć rozmiar tablicy zawierającej elementy mają być przekazane do execvp.

Zobacz poniższy przykład, ale należy pamiętać, że strtok będzie zmodyfikować ciąg przekazany do niego. Jeśli nie chcesz, aby tak się stało, musisz wykonać kopię oryginalnego ciągu znaków, używając strcpy lub podobnej funkcji.

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 rad służyć. –

+0

@ FilipRoséen-refp można wyjaśnić ostatni blok kodu przed drukowaniem i uwolnienie pamięci,: '/ * realloc jeden dodatkowy element ostatniego NULL * /'? Mam trudności z jej zrozumieniem. – Abdul

+0

@Abdul Wierzę, że zazwyczaj na końcu każdej tablicy występuje znak null, dzięki czemu komputer może rozróżnić dwie różne tablice. – Charles

6

Here is an example of how to use strtok zapożyczone z MSDN.

a odpowiednim bitów, trzeba nazwać to wiele razy. token char * jest częścią byś rzeczy do tablicy (można dowiedzieć się, że część).

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

Rozumiem to bardzo, ale to nie daje mi szeregu ciągów z tokenów. Chyba nie rozumiem tej konkretnej części. – Jordan

+0

Dlaczego 'token = strtok (NULL, seps);'? Dlaczego "NULL"? – Charles

+0

@ c650 Zobacz połączoną stronę z MSDN, kolejne wywołania wymagają 'NULL'. –

Powiązane problemy