2015-04-25 84 views
3

我想用C語言編寫一個解析程序,它將從HTML文檔中獲取特定段落的文本。爲此,我需要在文檔中查找子字符串「name」的所有實例:然而,C函數strstr只能找到子串的第一個實例。我找不到第一個實例以外的任何函數,並且我已經考慮在找到它之後刪除每個子字符串,以便strstr將返回下一個字符串。我無法得到這兩種方法的工作。如何在C中查找所有出現的子字符串

順便說一句,我知道while循環限制了這六次迭代,但我只是測試這個,看看我是否可以讓函數在第一時間工作。

while(entry_count < 6) 
{ 
    printf("test"); 
    if((ptr = strstr(buffer, "\"name\":")) != NULL) 
    { 
     ptr += 8; 
     int i = 0; 
     while(*ptr != '\"') 
     { 
      company_name[i] = *ptr; 
      ptr++; 
      i++; 
     } 
     company_name[i] = '\n'; 
     int j; 
     for(j = 0; company_name[j] != '\n'; j++) 
      printf("%c", company_name[j]); 
     printf("\n"); 
     strtok(buffer, "\"name\":"); 
     entry_count++; 
    } 
} 
+0

'的strstr(的strstr(HTML,「名「)+ 1,」name「)'發現第二次出現'」name「'(提供的內部'strstr'沒有返回NULL) – pmg

回答

4

只是通過返回的指針,再加上一個,回strstr()去尋找下一個對手:

char *ptr = strstr(buffer, target); 
while (ptr) { 
    /* ... do something with ptr ... */ 
    ptr = strstr(ptr+1, target); 
} 

詩篇。雖然你當然可以做到這一點,我想建議你的不妨考慮更適合的工具來做:

  • C是一個非常低級的語言,並試圖寫字符串在其中解析代碼是很費力的(特別是如果你堅持從頭開始編碼所有東西,而不是使用現有的解析庫或解析器生成器)並且容易出現錯誤(其中一些錯誤(如緩衝區溢出)可能會產生安全漏洞)。有很多更高級的腳本語言(比如Perl,Ruby,Python甚至是JavaScript),它們更適合於這樣的任務。

  • 解析HTML時,你應該使用合適的HTML解析器(最好與一個好的DOM生成器和查詢工具結合使用)。這將允許您根據文檔的結構找到您想要的數據,而不僅僅是匹配原始HTML源代碼中的子字符串。真正的HTML解析器也會透明地處理諸如字符集轉換和字符實體解碼等問題。 (是的,有 HTML解析器C,如GumboHubbub,這樣你就可以和應該使用一個即使你堅持堅持C.)

相關問題