2011-08-16 78 views
11

Có cách nào trong C để tách một chuỗi (sử dụng strtok hoặc bất kỳ cách nào khác) trong đó dấu tách dài hơn một ký tự không? Tôi đang tìm một cái gì đó như thế này:Có cách nào để tách một chuỗi trên nhiều ký tự trong C?

char a[14] = "Hello,World!"; 
char *b[2]; 
b[0] = strtok(a, ", "); 
b[1] = strtok(NULL, ", "); 

Tôi muốn điều này không chia chuỗi vì không có khoảng trống giữa dấu phẩy và W. Có cách nào để làm điều đó?

Trả lời

8

Bạn có thể liên tục gọi substr để tìm các lần xuất hiện của chuỗi ranh giới của bạn và chia dọc theo kết quả. Sau khi bạn tìm thấy kết quả, hãy nâng con trỏ lên theo chiều dài của chuỗi con và tìm kiếm lại.

+0

Đó có phải là C hoặc C++ không? – Jason

+2

Đó là C nếu bạn bao gồm '', và đó là C++ nếu bạn nói 'std :: substr' và bao gồm' ', mặc dù trong C++ bạn sẽ không sử dụng con trỏ char thường cho chuỗi. –

+0

@Kerrek: Tùy thuộc vào những gì bạn đang làm. Các cặp con trỏ char làm việc thực sự tốt để phân tích cú pháp các tệp văn bản được ánh xạ bộ nhớ mà không cần các bản sao hoặc phân bổ dữ liệu. Bạn quấn chúng trong một lớp học tốt đẹp, tất nhiên. –

4

Bạn có thể sử dụng char * strstr(const char *haystack, const char *needle) để định vị chuỗi dấu phân tách trong chuỗi của mình.

char a[14] = "Hello,World!"; 
char b[2] = ", "; 
char *start = a; 
char *delim; 
do { 
    delim = strstr(start, b); 
    // string between start and delim (or end of string if delim is NULL). 
    start = delim + 2; // Use lengthof your b string. 
} while (delim); 
+0

Điều đó sẽ không cung cấp cho bạn bất cứ điều gì trước dấu phân tách đầu tiên (bao gồm cả không cho bạn gì cả trong trường hợp "Xin chào, Thế giới!" –

+0

Cảm ơn Brian. Đã sửa lỗi. –

+1

-1 nếu strstr trả về NULL bạn sẽ tăng NULL; 'char * b [2] = "," là một sai lầm, đúng là 'char b [] = ",";' hoặc 'const char * b = ",";' – user411313

1

Điều gì đó giống như vậy? Không đảm bảo rằng điều này biên dịch. ;)

char* strstrtok(char *haystack, char *needle) { 
    static char *remaining = null; 
    char *working; 

    if(haystack) 
     working = haystack; 
    else if(remaining) 
     working = remaining; 
    else 
     return NULL; 

    char *result = working; 
    if(result = strstr(working, needle)) 
     remaining = working + strlen(needle) + 1; 

    return result; 
} 
+0

nó chỉ là mã C99 – user411313

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