2010-01-19 32 views
7

Làm cách nào để chia chuỗi thành mã thông báo theo số '&' trong C?Làm thế nào để tách một chuỗi thành các thẻ trong C?

+1

http://stackoverflow.com/questions/266357/tokenizing-strings-in-c –

+0

Hình như câu hỏi đó là việc phải tách nhỏ một chuỗi chữ (mặc dù câu hỏi là thấp trên chi tiết, nói rằng "không công việc"). Điều này có thể hoặc không phải là những gì OP muốn. Chúng ta nên cho anh ta một cơ hội để giải thích điều đó. Chuỗi có bị chia nhỏ một chuỗi ký tự hay là chỉ đọc? –

Trả lời

10

strtok/strtok_r

char *token; 
char *state; 

for (token = strtok_r(input, "&", &state); 
    token != NULL; 
    token = strtok_r(NULL, "&", &state)) 
{ 
    ... 
} 
6

tôi sẽ làm điều đó một cái gì đó như thế này (sử dụng strchr()):

#include <string.h> 

char *data = "this&&that&other"; 
char *next; 
char *curr = data; 
while ((next = strchr(curr, '&')) != NULL) { 
    /* process curr to next-1 */ 
    curr = next + 1; 
} 
/* process the remaining string (the last token) */ 

strchr(const char *s, int c) trả về một con trỏ đến vị trí tiếp theo của c trong s, hoặc NULL nếu c isn' t được tìm thấy trong s.

Bạn có thể có thể sử dụng strtok(), tuy nhiên, tôi không thích strtok(), bởi vì:

  • nó đổi các chuỗi được tokenized, vì vậy nó không làm việc cho chuỗi chữ, hoặc không phải là rất hữu ích khi bạn muốn giữ chuỗi cho các mục đích khác. Trong trường hợp đó, trước tiên bạn phải sao chép chuỗi này thành chuỗi.
  • nó hợp nhất các dấu phân cách liền kề, vì vậy nếu chuỗi của bạn là "a&&b&c", mã thông báo trả lại là "a", "b""c". Lưu ý rằng không có mã thông báo trống nào sau "a".
  • không an toàn.
+0

Tôi cho rằng nó cũng phụ thuộc vào việc triển khai C. Trên hệ thống của tôi, chuỗi ký tự không được sửa đổi khi tôi gọi strtok(). Thực ra tôi thậm chí không thấy nó có thể như thế nào. Sau khi tất cả nó chỉ có để sản xuất con trỏ đến sự bắt đầu của các thẻ khác nhau trong chuỗi. –

+0

Cees Meijer: 'strtok()' * không * sửa đổi chuỗi đối số - các ký tự dấu phân cách được thay thế bằng '\ 0', để các chuỗi được trả lại được kết thúc đúng cách. – caf

+1

'strtok' * có * để sửa đổi chuỗi nếu nó phải tuân thủ các tiêu chuẩn. Từ tiêu chuẩn C: * Nếu tìm thấy một ký tự như vậy, ký tự đó sẽ bị ghi đè bởi một ký tự null, kết thúc mã thông báo hiện tại *. Điều này rất rõ ràng. http://opengroup.org/onlinepubs/009695399/functions/strtok.html. Bạn có thể gửi mã nơi 'strtok()' không sửa đổi chuỗi? –

2

Bạn có thể sử dụng hàm strok() như minh họa trong ví dụ bên dưới.

/// Function to parse a string in separate tokens 

int parse_string(char pInputString[MAX_STRING_LENGTH],char *Delimiter, 
        char *pToken[MAX_TOKENS]) 
{ 
    int i; 
    i = 0; 

    pToken[i] = strtok(pInputString, Delimiter); 
    i++; 

    while ((pToken[i] = strtok(NULL, Delimiter)) != NULL){ 
    i++; 
    } 
    return i; 
} 

/// The array pTokens[] now contains the pointers to the start of each token in the (unchanged) original string. 

sprintf(String,"Token1&Token2"); 
NrOfParameters = parse_string(String,"&",pTokens); 

sprintf("%s, %s",pToken[0],pToken[1]); 
Các vấn đề liên quan