字符串准长度

/*求字符串准长度函数
用来求一个即包含字母数字又包含文字的字符串的长度(一个中文字只算1个长度)
p:接收字符串
返回值:字符串的准长度*/
int Strlen(char *p)
{
 int len=0;
 while(*p!='')
 {
  len++;
  (*p>0)?p++:p=p+2;  //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位)
 }
 return len;
}

/*判断一个字符串是否包含另一个字符串函数(字符串中的字符即可以是字母数字又可以是文字)
用来判断一个字符串是否包含另一个字符串(即一个字符串是否是另一个字符串的子串)
a:接收长字符串  b:接收短字符串(即要判断的子串)
返回值:0:b不是a的子串 1:b是a的子串*/
int Contain(char* a,char *b)
{
 int len=Strlen(b);
 while(*a!='')
 {
  bool flag;
  if(*a<0)  //如果当前的字符的ASCII码为正(判断一位是否相等),为负(判断两位是否相等)
  {
   flag=(*a==*b&&*(a+1)==*(b+1));   //判断两位
  }
  else
  {
   flag=(*a==*b);    //判断一位
  }
  if(flag)
  {
   char *p=a,*q=b,count=0;
   while(*p!=''&&*q!='') 
   {
    if(*p<0)   //如果当前的字符的ASCII码为正(判断一位是否相等),为负(判断两位是否相等)
    {
     flag=(*p==*q&&*(p+1)==*(q+1));   //判断两位
    }
    else
    {
     flag=(*p==*q);    //判断一位
    }
    if(flag) count++;  //相等count加1
    (*p>0)?p++:p=p+2;  //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位)
    (*q>0)?q++:q=q+2;
   }
   if(count==len)   //count等于字符串b的准长度表示字符串a包含字符串b返回1
   {
    return 1;
   }
  }
  (*a>0)?a++:a=a+2;  //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位)
 }
 return 0;
}

/*姓名模糊查找函数(姓名或条件字符串中的字符即可以是字母数字又可以是文字)
功能说明:此函数用来判断姓名字符串与条件字符串的相似程度
(
    例如:若查找条件字符串叫"李斌强",则程序将
    按'李斌强'、'李斌'、'斌强'、'李'、'斌'、'强'
    依次匹配,匹配一个相似程度相应增加一级,
    若一个人的姓名叫"李斌强",则其相似程度为6级;
    若一个人的姓名叫"李斌宾强",则其相似程度为4级;
    若一个人的姓名叫"王斌强",则其相似程度为3级;
    若一个人的姓名叫"李宾强",则其相似程度为2级;
    若一个人的姓名叫"李bin强",则其相似程度为2级;
    若一个人的姓名叫"Mr.李",则其相似程度为1级;
)
foun:接收姓名字符串  cond:接收条件字符串
返回值:相似程度(假设条件字符串有3个汉字,则最大相似程度为6级<1+2+3=6>)*/
int Namcmp(char* foun,char* cond)
{
 char* p=cond;
 int len=Strlen(cond);
 int count=0;    //记录相似程度
 for(int i=0;i<len;i++)  //条件字符串的准长度
 {
  p=cond;
  for(int j=0;j<i+1;j++)  //有多少个准长度相同的子串就循环多少次
  {
   char *s=p;
   char temp[20];
   char *t=temp;
   for(int k=0;k<len-i;k++)  //子串的准长度是多少就循环多少次
   {
    if(*s>0)     //如果当前的字符的ASCII码为正(赋值一位),为负(赋值两位)
    {
     *t=*s;   //赋值一位
    }
    else
    {
     *t=*s;
     *(++t)=*(++s);   //赋值两位
    }
    s++;
    t++;
   }
   *t='';
   t=new char[20];
   strcpy(t,temp);
   if(Contain(foun,t)) count++;   //判断姓名字符串是否包含刚拆分的条件字符串的子串
   delete t;
   (*p>0)?p++:p=p+2;    //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位)
  }
 }
 return count;
}

 

 

01./*
02.    string 转换为 wstring 
03.*/ 
04.std::wstring c2w(const char *pc) 
05.{ 
06.    std::wstring val = L""; 
07. 
08.    if(NULL == pc) 
09.    { 
10.        return val; 
11.    } 
12.    //size_t size_of_ch = strlen(pc)*sizeof(char);  
13.    //size_t size_of_wc = get_wchar_size(pc);  
14.    size_t size_of_wc; 
15.    size_t destlen = mbstowcs(0,pc,0); 
16.    if (destlen ==(size_t)(-1)) 
17.    { 
18.        return val; 
19.    } 
20.    size_of_wc = destlen+1; 
21.    wchar_t * pw  = new wchar_t[size_of_wc]; 
22.    mbstowcs(pw,pc,size_of_wc); 
23.    val = pw; 
24.    delete pw; 
25.    return val; 
26.} 
27./*
28.    wstring 转换为 string
29.*/ 
30.std::string w2c(const wchar_t * pw) 
31.{ 
32.    std::string val = ""; 
33.    if(!pw) 
34.    { 
35.        return val; 
36.    } 
37.    size_t size= wcslen(pw)*sizeof(wchar_t); 
38.    char *pc = NULL; 
39.    if(!(pc = (char*)malloc(size))) 
40.    { 
41.        return val; 
42.    } 
43.    size_t destlen = wcstombs(pc,pw,size); 
44.    /*转换不为空时,返回值为-1。如果为空,返回值0*/ 
45.    if (destlen ==(size_t)(0)) 
46.    { 
47.        return val; 
48.    } 
49.    val = pc; 
50.    delete pc; 
51.    return val; 
52.} 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值