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

自己写的字符串比较函数有关问题:中文是两个字节,比较容易出错

2012-03-14 
自己写的字符串比较函数问题:中文是两个字节,比较容易出错//该函数是比较字符dest中是否包含src由于是单个

自己写的字符串比较函数问题:中文是两个字节,比较容易出错
//该函数是比较字符dest中是否包含src 由于是单个字节比较 所以出现了问题:
//比如 “魔防球”的字节排列是 C4 A7 B7 C0 C7 F2 “狼”的字节排列是 C0 C7  
//这样实际没有“狼“这个词却返回了true 这可如何是好????请大虾指教
bool strcmp_m(const char *dest,int len1,const char *src,int len2) // len1 是 dest的长度 len2 是src的长度
{
int temp = 0 ,tempok; //tempok 是记录比较的正确的dest中的第一个相
  //对位置 temp 记录正确字节数 如果字节
  //数>= src 的长度 len2 就说明包含src  

for(int j = 0 ; j < len1; j++) //被比较的字符混换
{
if(*(dest+j)== *(src+temp))
{
temp++;
if(temp == 0)tempok = j;
}
else if(temp != 0)
{
j = tempok;
temp = 0 ;
}

if(temp >= len2) return true;
}
return false;
}

[解决办法]

C/C++ code
#include <iostream>using namespace std; //该函数是比较字符dest中是否包含src  由于是单个字节比较 所以出现了问题: //比如 “魔防球”的字节排列是 C4 A7 B7 C0 C7 F2  “狼”的字节排列是 C0 C7    //这样实际没有“狼“这个词却返回了true  这可如何是好????请大虾指教 bool  strcmp_m(const char *dest, const char *src) // len1 是 dest的长度    len2 是src的长度 {     int len1, len2;          if( (len1 = strlen(dest)) < (len2 = strlen(src)) )        return false;     int  temp = 0 ,tempok;  //tempok 是记录比较的正确的dest中的第一个相                                     //对位置  temp 记录正确字节数  如果字节                                     //数>= src 的长度 len2 就说明包含src      for(int j = 0 ; j < len1; j++)      //被比较的字符混换     {         if(*(dest+j) == *(src+temp))         {             temp++;             if(temp == 0)                 tempok = j;         }         else if(temp != 0)         {             j = tempok;             temp = 0 ;         }         if(temp >=  len2 && j%2 == 1)              return true;     }     return false; }int main(){    bool b = strcmp_m("魔防球","狼");     cout << b << endl;    system("pause");}
[解决办法]
C/C++ code
int strcmp_m(char *s,char *d){    char *p=d,*q=NULL; //p为指向被查找的字符串    //q暂时保存上次s指针到达的地点,方便,返回再继续查找    while(*s)    {        if(*s==*d)        {            q=s;            while(*(++s)==*(++p));            if(!*p)            {                return 1;            }            p=d;            s=q;        }        s+=2; //注意这个地方,每次跳过两个字节就是了    }    return 0;}int main(){    printf("%d\n",strcmp_m("魔防球","防球"));    return 0;} 

热点排行