读书人

有关字符串查找,该怎么解决

发布时间: 2012-05-15 14:35:29 作者: rapoo

有关字符串查找
unsigned char name[]="<li>B<ol><li>C</li> <li>D</li></ol></li><ol>E</ol>"

我想写一个函数,如找到第一个<ol>项,由于第一个<ol>在红色的标签之内,因此把红色部分跳过,找到下一个<ol>的'<'地址并返回,以下是部分代码(灰色标示部分为主程序,其他为调用),求大家帮帮忙啊,小弟不胜感激!

#include <stdio.h>
typedef unsigned char byte;
typedef unsigned int word;
typedef byte * string;
typedef string * list;
byte endingStr[] = "<>\r\n";
byte isTagEnd(string tag) //找到末标签</li>,tag[0]='<', tag[1]='/'.
{
if (tag[1] == '/') return 1;
else return 0;
}
byte isCharInString(byte chr, string str)
{
byte i = 0;
if (chr == '\0') return 1;
while (str[i] != '\0')//未比较完毕继续比较
{
if (chr == str[i]) return 1; //找到一个相等的,就返回,否则找下一个
else i++;
}
return 0;//遇到终止符结束
}

byte isEqualStrings(string str1, string str2) //比较两个字符串是否相等
{
byte i = 0;
while (str1[i] == str2[i])
{ if (isCharInString(str1[i+1], endingStr)) //str1结束字符'>',
return isCharInString(str2[i+1], endingStr);//如果返回值1,则表示str2与str1完全一样,否则不同
else if (isCharInString(str2[i+1], endingStr))//字符串2中有结束字符,返回0
return 0;
else i++;
}
return 0;
}
string getTagName(string tag) //得到指向标签内容的地址,以<li>,</li>为例子,tag[0]指向'<',tag[1]不是'/'就表示是<li>
{
if (tag[1] == '/') return (tag + 2);
else return (tag + 1);
}
byte isTagName(string tag, string name)
{
return (isEqualStrings(getTagName(tag), name));
}
word nextTag(string menu) //找到下一个'<'返回偏移量i

{
word i = 1;
while (menu[i] != '<')
{ if ((menu[i] == '\0')) return 0;
else i++;
}
return i;
}

word skipTag(string tag) //跳到'>'后,返回偏移量
{
word i = 1;
while (tag[i] != '>')
{
if (tag[i] == '\0') return (i);
else i++;
}
return (i + 1);
}
word skipItem(string menu) reentrant
{
word offset;
if (isTagEnd(menu)) return 0; //末标签,返回0.
offset = nextTag(menu); //找到下一个标签,指向'<' ,返回偏移量
if (offset == 0) return 0; //未找到下一个标签
if (isTagName(menu + offset, getTagName(menu))) //比较menu,menu+offset两者的值是否相等,相等则执行括号里的语句
{
if (isTagEnd(menu + offset)) //若第二个为末标签,则查找成功
return (offset + skipTag(menu + offset));
} else
{
if (isTagEnd(menu + offset))//如果两者不匹配,但又是末标签,则返回当前偏移量
return (offset);
}
return (offset + skipItem(menu + offset));
}

现在这个函数只能实现返回字符串中紫色部分'<'的地址,求大家帮忙修改修改,不胜感激。

unsigned char name[]="<li>B<ol><li>C</li><li> D</li></ol></li><ol>E</ol>"


[解决办法]
没看懂,你到底想要什么?
[解决办法]
我写了一个程序,不知你是否能够理解。


C/C++ code
#include <string.h>#include <stdio.h>  void get_OL_value(const char *string,char *pResult){    int tag_li_open=0;    int tag_ol_open=0;        char value[256];    const char *p1;    const char *p2;    const char *pEnd;        memset(value,0,sizeof(value));    pEnd=string+strlen(string)-1;    p1=string;    while (p1<=pEnd && p1!=NULL)    {        if ( *p1=='<')        {            p2=strchr(p1,'>');             if (p2!=NULL)            {                if ( strncmp(p1+1,"li", p2-p1-1) ==0)                    tag_li_open++;                else if ( strncmp(p1+1,"/li", p2-p1-1 )==0)                    tag_li_open--;                else if ( strncmp(p1+1,"ol", p2-p1-1 )==0)                    tag_ol_open++;                else if  ( strncmp(p1+1,"/ol", p2-p1-1 )==0)                    tag_ol_open--;                p1=p2+1;            }        }        else        {            p2=strchr(p1,'<');            if (p2!=NULL)            {                strncpy(value,p1,p2-p1);                value[p2-p1]=0;#ifdef _DEBUG            printf("find value [%s]\n",value);            printf("li tag is %d, ol tag is %d\n",tag_li_open,tag_ol_open);#endif            if ( tag_ol_open<0 || tag_li_open>0)                value[0]=0;    //clear value            }            p1=p2;        }    }    strcpy(pResult,value);}int main(){    char buff[256];    char name[]="<li>B<ol><li>C</li> <li>D</li></ol></li><ol>E</ol>";    get_OL_value(name,buff);    printf("find value %s\n",buff);} 

读书人网 >C语言

热点推荐