将字符串中的strstr搜索复制到字符串本身

时间:2012-05-27 15:17:03

标签: c string strstr

我正在尝试解析网页并用C(masochist,我知道)从中提取天气信息。

在该页面的其他内容中,有以下几行:

           <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)。 处理包含字符串&lt;的行的部分dt&gt;如下。

   } 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&gt; \ nphase:而不是过去24h-Snow:,我得到了Paw:24小时Snow:。 奇怪的是,只有这些特殊的字符串才会发生。 我不能将字符串上的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);

合法吗?

1 个答案:

答案 0 :(得分:2)

当源和目标字符串重叠时,strcpy()等函数的行为未定义。

如果必须将记忆(字符串)移动到位,请确保知道字符串的长度并使用memmove();当字符串重叠时,保证可以正常工作。