2012-06-25 42 views
31

Tôi không hoàn toàn chắc chắn làm thế nào để làm điều này trong C:C - chia chuỗi thành một mảng các chuỗi

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

Làm thế nào tôi sẽ đi về việc này?

+4

Nếu bạn muốn chia nhỏ dựa trên không gian, tại sao bạn đã chỉ định ';' làm dấu phân cách? –

+2

Ví dụ: string = "ls -l; date; set + v" – Jordan

Trả lời

49

Vì bạn đã xem strtok chỉ cần tiếp tục xuống cùng một đường và chia chuỗi của bạn bằng cách sử dụng dấu cách (' ') làm dấu phân tách, sau đó sử dụng thứ gì đó là realloc để tăng kích thước của mảng chứa các phần tử được chuyển đến execvp.

Xem ví dụ bên dưới, nhưng hãy nhớ rằng strtok sẽ sửa đổi chuỗi được truyền cho nó. Nếu bạn không muốn điều này xảy ra, bạn được yêu cầu tạo một bản sao của chuỗi gốc, sử dụng strcpy hoặc chức năng tương tự.

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 vui mừng được phục vụ. –

+0

@ FilipRoséen-refp Bạn có thể giải thích khối mã cuối cùng trước khi in và giải phóng bộ nhớ,: '/ * realloc thêm một phần tử cho NULL * /' cuối cùng không? Tôi đang gặp khó khăn khi hiểu nó – Abdul

+0

@Abdul Tôi tin rằng thường có một ký tự null ở cuối mỗi mảng sao cho máy tính có thể phân biệt giữa hai mảng khác nhau. – Charles

6

Here is an example of how to use strtok mượn từ MSDN.

Và các bit liên quan, bạn cần phải gọi nó nhiều lần. Các token char * là phần bạn sẽ thứ vào một mảng (bạn có thể tìm ra phần đó).

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

Tôi hiểu điều này nhiều, nhưng điều này không cung cấp cho tôi một chuỗi các chuỗi từ các thẻ. Tôi đoán tôi không hiểu một phần cụ thể của nó. – Jordan

+0

Tại sao 'token = strtok (NULL, seps);'? Tại sao 'NULL'? – Charles

+0

@ c650 Xem trang được liên kết từ MSDN, các cuộc gọi tiếp theo cần 'NULL'. –

Các vấn đề liên quan