2017-02-20 114 views
-4
<td>&nbsp;<a href="wtzresult.php?CiID=41832&forma=12h"> Asmara </a>&nbsp;</td><td width=``"100">Sun, 09:08 PM</td></tr><tr> 
<td>&nbsp;<a href="wtzresult.php?CiID=42107&forma=12h"> Astana </a>&nbsp;</td><td width="100">Mon, 12:08 AM</td></tr><tr bgcolor="#E0E0E0"> 
<td>&nbsp;<a href="wtzresult.php?CiID=4698&forma=12h"> Asuncion </a>&nbsp;</td><td width="100">Sun, 03:08 PM<sup>dst</sup></td></tr><tr> 
<td>&nbsp;<a href="wtzresult.php?CiID=3963&forma=12h"> Athens </a>&nbsp;</td><td width="100">Sun, 08:08 PM</td></tr><tr bgcolor="#E0E0E0"> 

我想分析「雅典陽光,下午8點08分」 我測試 並得到線使用函數strtok 解析一天,一個時鐘,但返回分段錯誤 感謝名單從長文本解析文件在C

while(fscanf(fp,"%s",word) != EOF){ 
    if (strstr(word,"Athens") != NULL) 
     strcpy(p,word); 
    } 
+2

什麼是'p'?和'字'?你目前的問題是什麼?而且:如何檢索'fd'? – LPs

+0

和文件中的文字 –

+3

編輯您的問題:請勿使用評論發佈其他內容。 – LPs

回答

0

你可以使用strstr()獲得的指針雅典的開頭你的字符串,然後通過人物和循環修剪所有字符'<''>',包括與自己和組成一個新的字符串。這將使您獲得所需的輸出。

0

相反的fscanf(),閱讀文件的每一行與fgets(3)。在您的文件中查找"Athens Sun, 08:08 PM",您可以使用strstr(3)匹配Athens",然後您可以使用strtok(3)解析行的其餘部分,使用html標記<>作爲分隔符。

然後,您可以使用strcat(3)strcpy(3)將這些字符串添加到動態分配的char*指針。你需要確保這個指針可以同時按住"Athens""Sun, 08:08 PM",加上一個空格和\0空終止符。您還可以將找到的字符串與strcmp(3)進行比較。

這裏是你如何能做到這樣一個例子:

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

#define LINESIZE 1024 

int main(void) { 
    FILE *fp; 
    char *ret, *token, *result; 
    char line[LINESIZE] = {0}; 
    size_t numbytes, slen; 

    const char *city = "Athens"; 
    const char *datetime = "Sun, 08:08 PM"; 
    const char *delim = "<>\n"; 
    const char *space = " "; 

    fp = fopen("html.txt", "r"); 
    if (fp == NULL) { 
     fprintf(stderr, "Cannot open file\n"); 
     exit(EXIT_FAILURE); 
    } 

    numbytes = strlen(city) + strlen(datetime) + 1; 

    result = malloc(numbytes+1); 
    if (!result) { 
     fprintf(stderr, "Cannot allocate string\n"); 
     exit(EXIT_FAILURE); 
    } 

    while (fgets(line, LINESIZE, fp) != NULL) { 
     ret = strstr(line, city); 
     if (ret != NULL) { 
      token = strtok(ret, delim); 
      while (token != NULL) { 
       slen = strlen(token); 
       for (int i = (int)slen-1; i >= 0; i--) { 
        if (!isspace(token[i])) { 
         token[i+1] = '\0'; 
         break; 
        } 
       } 

       if (strcmp(token, city) == 0) { 
        strcpy(result, token); 
        strcat(result, space); 
       } 
       if (strcmp(token, datetime) == 0) { 
        strcat(result, token); 
       } 
       token = strtok(NULL, delim); 
      } 
     } 
    } 

    printf("Extracted string: %s\n", result); 

    free(result); 
    result = NULL; 

    return 0; 
} 
0

也許這會給你一些想法。您的分段錯誤可能來自於超出緩存空間以取消引用空指針(我猜測這是p變量)。當然,如果輸入的格式偏離你的代碼片段,代碼將是無用的。在C中稍微提前一點之後,您可能還需要查看expat庫。這需要將這些行轉換成很少的XML文檔。我確信存在用於C的HTML解析庫,但我沒有嘗試過它們。

至少該程序的結果是: 雅典太陽,下午8點08

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

int main() 
{  
    char buf[1024]; 
    FILE *fp = fopen("the-data-file.txt","r"); 
    if(!fp){ /* error handling */ } 

    while(fgets(buf, sizeof(buf), fp)){ 
     char* city = strstr(buf,"Athens"); 
     char* td = city ? strstr(city, "<td") : NULL; 
     char* greater_than = td ? strstr(td, ">") : NULL; 
     char* less_than = greater_than ? strstr(greater_than, "<") : NULL; 
     if(less_than){ 
     while(*city && isalpha(*city)){ 
      printf("%c", *city++); 
     }  
     printf(" "); 
     while(++greater_than < less_than){ 
      printf("%c", *greater_than); 
     }  
     printf("\n"); 
     }  
    }  


    fclose(fp); 

} 
+0

哦,我忘了一個明顯的評論。嘗試使用-g編譯並在調試器中運行以確定崩潰發生的位置。祝你好運。 –