有关字符串查找
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>"
[解决办法]
没看懂,你到底想要什么?
[解决办法]
我写了一个程序,不知你是否能够理解。
#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);}