2012-05-27 70 views
1

我試圖解析一個網頁並從C中提取天氣信息(我知道,受虐狂)。將一個字符串中的strstr搜索複製到字符串本身

在該頁面中的其它東西,有這些行:

  <dt>Chance of <span class='wx-firstletter'>rain</span>:</dt> 

        <dt>Wind:</dt> 

     <dt>Humidity:</dt> 

     <dt>UV Index:</dt> 

<dt>Snowfall:</dt> 

     <dt>Sunrise:</dt> 

     <dt>Moonrise:</dt> 

     <dt>Moonphase:</dt> 

        <dt>Past 24-hr Precip:</dt> 

     <dt>Past 24-hr Snow:</dt> 

      <dt>Chance of <span class='wx-firstletter'>rain</span>:</dt> 

        <dt>Wind:</dt> 

     <dt>Humidity:</dt> 

     <dt>UV Index:</dt> 

<dt>Snowfall:</dt> 

     <dt>Sunset:</dt> 

     <dt>Moonset:</dt> 

     <dt>Moonphase:</dt> 

        <dt>Past 24-hr Precip:</dt> 

     <dt>Past 24-hr Snow:</dt> 

後,我已經下載了頁面,它保存在一個文件中,並在用fread陣列讀它,我用一個循環逐行讀取數組,將其保存到臨時數組(tmp)。 處理包含字符串< dt>的行的部分如下。

} else if (strstr(tmp,"<dt>")) { 
     strcpy(tmp,strstr(tmp,"<dt>")+4); 
     strcpy(strstr(tmp,"</dt>")," \0"); 
     if (strstr(tmp,"Chance of")) 
       strcpy(tmp,"Chance of precipitation: "); 
     fwrite(tmp,1,strlen(tmp),file_tod); 
    } else if .... 

一切都很順利,除了月相和過去的24h雪線。

Chance of precipitation: 
Wind: 
Humidity: 
UV Index: 
Snowfall: 
Sunrise: 
Moonrise: 
Mo> 
phase: 
Past 24-hr Precip: 
Paw: 24-hr Snow: 
Chance of precipitation: 
Wind: 
Humidity: 
UV Index: 
Snowfall: 
Sunset: 
Moonset: 
Mo> 
phase: 
Past 24-hr Precip: 
Paw: 24-hr Snow: 

非但沒有月相的:,我得到莫> \ n相:和而不是讓過去的24小時,雪:,我得到爪:24小時雪:。 奇怪的是,只有這些特定的字符串正在發生。 我不能將字符串上strstr的結果複製到字符串本身嗎?

strcpy(tmp,strstr(tmp,「」)+ 4);

這是犯罪行嗎?我在其他代碼中使用相同的方法,沒有任何問題。 如果我使用一箇中間變量(BUFF)來存儲檢索的strstr

} else if (strstr(tmp,"<dt>")) { 
    strcpy(buff,strstr(tmp,"<dt>")+4); 
    strcpy(strstr(buff,"</dt>")," \0"); 
    if (strstr(buff,"Chance of")) 
      strcpy(buff,"Chance of precipitation: "); 
    fwrite(tmp,1,strlen(buff),file_tod); 
} else if .... 

一切正常的結果。

感謝您的任何答案,並很抱歉,如果它是非常明顯的。

編輯:想出了這個

} else if (strstr(tmp,"<dt>")) { 
     memmove(tmp,strstr(tmp,"<dt>")+4,strlen(tmp)-(strlen(strstr(tmp,"<dt>")+4))); 
     *(strstr(tmp,":")+1)=' '; 
     *(strstr(tmp,":")+2)='\0'; 
     if (strstr(tmp,"Chance of")) 
       strcpy(tmp,"Chance of precipitation: "); 
     fwrite(tmp,1,strlen(tmp),file_tod); 

是否合法?

回答

2

當源字符串和目標字符串重疊時,像strcpy()這樣的函數的行爲是未定義的。

如果你必須做內存(字符串)原位移動,請確保你知道字符串的長度,並使用memmove();這是保證在字符串重疊時工作。

+0

非常感謝您的快速回答。我會調查到memmove併發回。 – TeoBigusGeekus

相關問題