1

私はウェブページを解析し、C(マゾヒスト、私は知っています)を使ってそこから天気情報を抽出しようとしています。

そのページには、次のような行があります。

           <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を使用して配列で読み取った後、ループを使用して配列を1行ずつ読み取り、一時配列(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 ....

ムーンフェイズと過去24時間の雪線を除いて、すべてがうまくいきます。

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: 

Moonphase:を取得する代わりに、Mo> \ nphase:を取得し、Past 24h-Snow:を取得する代わりに、Paw:24-hr Snow:を取得します。奇妙なことは、これらの特定の文字列だけで起こっているということです。文字列のstrstrの結果を文字列自体にコピーできませんか?

strcpy(tmp、strstr(tmp、 "")+ 4);

これは問題のある行ですか?残りのコード全体で同じ方法を問題なく使用しています。strstr検索の結果を格納するために中間変数(buff)を使用する場合

} 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);

それは合法ですか?

4

1 に答える 1

2

ソース文字列とターゲット文字列が重なっている場合などの関数の動作strcpy()は未定義です。

その場でメモリ (文字列) を移動する必要がある場合は、文字列の長さを確認し、memmove();を使用してください。これは、文字列が重なっている場合に機能することが保証されています。

于 2012-05-27T15:27:29.480 に答える