2016-01-08 123 views
-3

我想用strtok()當分隔符是一個字符串,如 " break point "
的strtok()時,分隔符是字符串

This is the first part. break point This is the second part 

成爲:

  1. This is the first part.
  2. This is the second part

問題是當我包含空格時,它也實現了每個空格。

下面是相關代碼:

char seps[5] = " $$$ "; 
char *token; 
char current[500] = {0}; 
int i=0; 
while(fgets(current, 500, relevantFile) != NULL){ 
    printf("number %d:\n", i+1); 
    token = strtok(current, seps); 
    while(token != NULL){ 
     printf(token); 
     printf("\n"); 
     token = strtok(NULL, seps); 
    } 
    printf("\n"); 
    i++; 
} 

當前是 「Einstein, 1900 $$$ Mozart, 1700」。
控制檯預期的答案是:

number 1: 
Einstein, 1900 

number 2: 
Mozart, 1700 

而是它打印此:

number 1: 
Einstein, 
1900 

number 2: 
Mozart, 
1700 

回答

1

要刪除串,你可能想嘗試的東西的strstr()。找到想要刪除的子字符串,然後在其中放置一個空終止符'\ 0',並將strcat()放在它被刪除的子字符串之後的剩餘部分。

如:

#include <stdio.h> 
#include <string.h> 

void removeSubstr (char *string, char *sub) { 
    char *match; 
    int len = strlen(sub); 
    while ((match = strstr(string, sub))) { 
     *match = '\0'; 
     strcat(string, match+len); 
    } 
} 

int main(int argc, const char *argv[]) { 
    char test[] = "okay/op 1234 /opdone"; 
    removeSubstr(test, "/op"); 
    puts(test); 
    return 0; 
} 

編輯:在您的代碼 SEPS字符串應該是 「$$$」,而不是 「$$$」。這將解決您的問題。

+1

我不想刪除子,但分裂字符串與指定的分隔符 –

+0

你的seps字符串有白色spaces.it應該是「$$$」而不是「$$$」 – CodeWarrior101

+0

這是趕上!我希望那些空格成爲分隔符的一部分 –

0

功能可以看看下面的方式,因爲它是在示範程序中顯示

#include <stdio.h> 
#include <string.h> 

char * split_string(char *s, const char *delimiter) 
{ 
    static char *p; 

    if (s) p = s; 

    size_t n = strlen(delimiter); 

    if (p && n != 0) 
    { 
     while (memcmp(p, delimiter, n) == 0) p += n; 
    } 

    if (!p || !*p) return p = NULL; 

    char *t = p; 

    if (n != 0) p = strstr(t, delimiter); 

    if (n == 0 || !p) 
    { 
     p = t + strlen(t); 
    } 
    else 
    { 
     *p = '\0'; 
     p += n; 
    } 

    return t; 
} 

int main(void) 
{ 
    char s1[] = "This is the first part. break point This is the second part"; 
    char t1[] = " break point "; 

    char *p = split_string(s1, t1); 

    while (p) 
    { 
     puts(p); 
     p = split_string(NULL, t1); 
    } 
    char s2[] = "Einstein, 1900 $$$ Mozart, 1700"; 
    char t2[] = " $$$ "; 

    p = split_string(s2, t2); 

    while (p) 
    { 
     puts(p); 
     p = split_string(NULL, t2); 
    } 

    return 0; 
} 

程序輸出是

This is the first part. 
This is the second part 
Einstein, 1900 
Mozart, 1700 
+0

在視覺工作室「$$$」之前和之後的空格仍然存在。 輸出與'strtok(current,「$$$」)相同;' –

+1

@TzahiLeh您錯了。該函數用嵌入的空格跳過字符串「$$$」。 –

+0

這就是我在運行代碼時得到的結果:\ –