自己写的字符串比较函数问题:中文是两个字节,比较容易出错
//该函数是比较字符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;
}
[解决办法]
#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");}
[解决办法]
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;}