首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-05-15 
有关字符串查找unsigned char name[]liBolliC/li liD/li/ol/liolE/ol我想写一个函

有关字符串查找
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);} 

热点排行