2011-12-11 90 views
0

我需要解析我的字符串,但我的分隔符是除a-z和A-Z以外的所有字符。 我該怎麼做?解析C中的字符串

我想strtok,但我必須寫所有字符作爲分隔符,它會太長。 Exampe字符串:

Ax'cda2hsa+AsF(f/a as 

它需要被分成: 「斧」, 「綜合發展區」, 「HSA」, 「ASF」 「F」 「一」 「爲」

是否有任何C解析功能圖書館,我可以寫我的所有delimeters間隔?

+0

你真的用C或者是C++?如果你使用C++,你可以使用Boost Regex。 –

+1

只需掃描字符串,將所有連續的字母扔入單獨的字符串中並繼續。 –

+0

我需要使用c – user1092043

回答

1

你可以走通的字符串,做自己,如果你不想做的正則表達式(3)

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

int main(int ac, char *av[]) { 
    char string[] = " Ax'cda2hsa+AsF(f/a as"; 
    int i,idx,len; 
    len = strlen(string); 
    #define MAX_SPLIT 256 
    #define MAX_SPLIT_MASK (MAX_SPLIT - 1) 
    char buf[MAX_SPLIT]; 
    for (idx = 0, i=0;i<len;i++) { 
     char c = string[i]; 
     if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <='Z')) { 
      buf[idx++ & MAX_SPLIT_MASK] = c; 
     } else { 
      buf[idx++ & MAX_SPLIT_MASK] = '\0'; 
      if (idx > 1) 
       printf("%s\n",buf); 
      idx = 0; 
     } 
    } 
    if (idx > 1) { 
      buf[idx++ & MAX_SPLIT_MASK] = '\0'; 
      printf("%s\n",buf); 
    } 
    #undef MAX_SPLIT 
    #undef MAX_SPLIT_MASK 

    return 0; 
} 
+2

爲什麼在完美的'isalpha'函數中使用比較? –

+0

其非常明智,但我只是好奇,是否有C庫中的任何解析函數,我可以將間隔記號作爲我的定界符? – user1092043

+0

爲什麼要寫出分隔符,如果要保留的字符來自有限集,而分隔符可以是任何內容? –

1

如果您正在尋找一個c庫函數,strspn(str, dict)是有用的。它返回字典中只包含字符的str的第一個子字符串的長度。因此,

strspn("hello world", "leh"); 

將返回4.

+0

我有太多的delimeters,所以我需要一個函數,我作爲間隔寫我的delimeters。 – user1092043

+0

有了這個,你不需要分隔符。你列出可接受的字母。 – Dave

+0

然後,我需要在字典部分寫abcd ... z,對嗎? – user1092043

0

使用strpbrk找到有效字符開始,然後strspn得到的長度。解壓縮爲新字符串。重複至strpbrk返回NULL