2011-10-12 84 views
0

即時嘗試拆分C中的字符串(不是以C#,C++或任何其他類型)。我試圖用德strtok的功能,但事實證明,當每個單詞之間的限制爲單個字符,這樣的一個空間,一個分號這只是工程....c中的拆分字符串

我有一個變量,它是一個包含字符串的html像這樣的代碼:

</head> 
<body> 
Index of /davidgoudet 
<ul><li><a href="/"> Parent Directory</a></li> 
<li><a href="Horario/"> Horario/</a></li> 
<li><a href="Oferta/"> Oferta/</a></li> 
<li><a href="Registro/"> Registro/</a></li> 
</ul> 
<address>Apache mod_fcgid/2.3.6 mod_auth_passthrough/2.1 mod_bwlimited/1.4    FrontPage/5.0.2.2635 Server at turpialdevelopment.com Port 80</address> 
</body></html> 

,我想有一個變量 內部在href標記,如Horario,Oferta,Registro之間的塊,但是當我試圖用的strtok(字符串的「href」),它給我有些奇怪的結果,這不是我正在尋找的那個。

任何想法? 感謝

+0

使用[解析器(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)。他來了。 –

回答

4

strtok採取所有可能的分隔符的字符數組,並將其分割基於任何這些字符(在你的情況下,分割上hre,或f),這可能是爲什麼你看到怪異的行爲。

是不是有一個原因,你沒有使用HTML解析庫來拉名稱?

的libxml的HTML解析器是相當不錯的:http://www.xmlsoft.org/html/libxml-HTMLparser.html

0

嘗試使用strstr(),然後偏移它返回給你的指針。

strstr(big_string_of_tags,"href")+6; //Leaves pointer at the word you're seeking, read up until you see a double quote char. 

它不是一個非常優雅的解決方案,但如果你僅限於C,它可能是一個好的開始。

0

您可以使用像strnstr()這樣的字符串比較函數來查找子字符串,例如開始和結束標記。然後,您可以輕鬆計算所需子字符串的位置和長度,並使用strncpy()來複制該數據。

1

這是我的解決方案,我希望能解決您的問題。

int split(char ***dst, char *str, char spliter) 
{ 
    int str_num = 0;  
    int each_size; 
    int index = 0;  
    int str_index = 0; 
    int start_index = 0; 

    while (str[index] != '\0') 
    { 
     if (str[index] == spliter) 
     { 
      str_num++; 
      index++; 
      while(str[index] == spliter) 
      { 
       index++; 
      } 
     } 
     else 
     { 
      index++; 
     } 
    } 
    str_num++; 

    *dst = (char **) malloc((str_num + 1)*sizeof(char*)); 
    index = 0; 

    while (str[index] != '\0') 
    { 
     if (str[index] != spliter) 
     { 
      start_index = index; 
      each_size = 0; 

      while (str[index] != spliter && str[index] != '\0') 
      { 
       index++; 
       each_size++; 
      } 

      (*dst)[str_index] = (char*) malloc((each_size + 1)*sizeof(char)); 
      int cur_i = 0; 

      while (start_index != index) 
      { 
       (*dst)[str_index][cur_i] = str[start_index]; 
       start_index++; 
       cur_i++; 
      } 

      (*dst)[str_index][cur_i] = '\0'; 
      str_index++; 
     } 
     else 
     { 
      index++; 
     } 
    } 

    (*dst)[str_num] = NULL; 
    return str_num; 
}