2014-03-04 32 views
0

我有串C:使用定界符同時節省了定界符

"this***is**my-beautiful--string"

字符串分割爲一個char [] [],我想這個分成

{"this", "***", "is", "**", "my", "-", "beautiful", "--", "string"}

有兩個分隔符"*-",所以我可以使用strtok()來查找單詞

b我怎樣才能添加到數組中的delimeters?

+0

如果'*'和'-'是分隔符,爲什麼它們是令牌的一部分?你真的想分割基於分隔符的字符串嗎? – HAL

+0

問題是,當字符串之前有'*'時,我必須做一些不同於字符串之前有'-'的東西。 – Dennis

+0

'strtok'會爲你的字符串寫一個空字符''\ 0'',所以你不能在這裏真正使用它 - 找到''this''後''分隔符'***''將被部分覆蓋。 (並且'strtok'不會在令牌化之後再次修補字符串。) –

回答

2

不能使用strtok在這裏,因爲它用空字符覆蓋它們「破壞」,在你輸入字符串的delmiters。您可以使用strspnstrcspn功能是這樣的:

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

int xmain() { 
    const char *str = "this***is**my-beautiful--string"; 
    const char *delim = "*-"; 

    const char *p = str; 
    int mode = strchr(delim, *str) == 0; 

    while (*p) { 
     int n; 

     if (mode) { 
      n = strcspn(p, delim); 
     } else { 
      n = strspn(p, delim); 
     } 
     printf("'%.*s'\n", n, p); 
     mode = !mode; 
     p += n; 
    } 

    return 0; 
} 

mode決定我們是否正在尋找一個分隔符或在之間的文本。基於此,我們必須查找包含字符(mode == 0)或不包含(mode == 1)在有效的delmiters字符串中的最長跨度。

此代碼可以在字符串文字上運行。它不會產生零終止的C字符串,但是,它們是常量字符串和字符串長度的組合。如果您需要將結果保存到數組中,我建議將它們保存爲指針加長度數據的結構。

通過分別將mode初始化爲1或0,可以強制啓動具有(可能爲空)令牌或分隔符的令牌。

+0

謝謝,這正是我需要的 – Dennis

-1

可以使用的strtok()這樣的

char line[] = "this***is**my-beautiful--string"; 
char *token; 
char *deli; 
deli="*-"; 

token = strtok(line, deli); 

while(token!=NULL){ 
    printf("%s",token); 
    token = strtok(NULL,deli); 
} 
+0

這並不保存分隔符正是問題所在。 – nwellnhof

+0

@nwellnhof哦,yah真的,我沒有得到這個觀點,我的錯誤和謝謝 –

0

這確實你說你想要的:

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

#define PARSED_CHUNKS 4 
struct parsed { 
    char **data; 
    size_t count; 
    size_t alloc; 
}; 

void allocate(struct parsed *p) 
{ 
    if (p->count == p->alloc) 
    { 
     p->alloc += PARSED_CHUNKS; 
     p->data = realloc(p->data, p->alloc * sizeof(char *)); 
     if (p->data == 0) 
     { 
      fprintf(stderr, "no memory\n"); 
      exit(1); 
     } 
    } 
} 

int main() 
{ 
    const char *str = "this***is**my-beautiful--string"; 
    const char *start; 
    unsigned int i; 
    struct parsed p; 

    memset(&p, 0, sizeof(p)); 

    for(;;) 
    { 
     allocate(&p); 

     start = str; 
     while(*str != '*' && *str != '-' && *str != '\0') 
      str ++; 
     if (str-start > 0) 
      p.data[p.count++] = strndup(start, str-start); 
     if (*str == '\0') 
      break; 

     allocate(&p); 

     start = str; 
     while(*str == '*' || *str == '-' && *str != '\0') 
      str ++; 
     p.data[p.count++] = strndup(start, str-start); 
     if (*str == '\0') 
      break; 

    }; 

    for (i = 0; i < p.count; i++) 
    { 
     printf("%d: %s\n", i, p.data[i]); 
    } 

    return 0; 
} 
0

您也可以輕鬆瞭解使用此程序。

#include"stdio.h" 
#include"stdlib.h" 
#include"string.h" 
main() 
{ 
    int i = 0 ,j = 0 ,k = 0,l=0; 
    char string[]="this***is**my-beautiful--string"; 
    char *string1[9],tem[20]; 
    for (i = 0 ; string[i] != '\0' ; i++) 
    { 
      if (isalpha(string[i])) 
      { 
        if(l != 0) 
        { 
        tem[l] = '\0'; 
        string1[k]=(char *)malloc(strlen(tem)+1); 
        strcpy(string1[k],tem); 
        k++; 
        l=0; 
        } 
        tem[j++]=string[i]; 
      } 
      else 
      { 
        if(j != 0) 
        { 
          tem[j] = '\0'; 
          string1[k]=(char *)malloc(strlen(tem)+1); 
          strcpy(string1[k],tem); 
          k++; 
          j=0; 
        } 
          tem[l++]=string[i]; 
      }    
    }             
    for (i = 0 ; i < k ; i++) 
      printf("split string is :%s\n",string1[i]); 
}