C\C++编写一个能将字母转换大小写、且模糊对比的StringMulti的函数
代码、注释
下面展示 StringMulti的函数
。
char* StringMulti(const char* str, const char* strSearch) {
//字符串对比,兼模糊对比。用 strSearch 与 str 对比str
int n = 1;
//定义n=1,由于申请char*类型的空间至少需要一个空间存放'\0',即结尾符
for (char* p = (char*)str; *p; p++, n++);
//定义一个char类型的指针p,指向str
//然后,判断*p != null,n++ ;循环判断传入的str的字符串有多长,得到str的长度n
char* s1 = (char*)malloc(n);
//导入头文件 #include <cstdlib>,调用malloc,在堆中申请具有n个空间的指针
for (char* ps1 = s1; *str; str++) strcpy(ps1++, str);
//定义新的指针ps1指向s1
//导入头文件#include <cstring>,调用strcpy
//使用for循环,以*str !=null为条件,str++ ,将str的内容拷贝到s1中
n = 1;
for (char* p = (char*)strSearch; *p; p++, n++);
char* s2 = (char*)malloc(n);
for (char* ps2 = s2; *strSearch; strSearch++) strcpy(ps2++, strSearch);
for (char* ps1 = s1; *ps1; ps1++)//定义指向s1的指针ps1,以*ps1 !=null做为判断条件
if (*ToggleCase(ps1) == *ToggleCase(s2))
//取ps1的一个字符与s2的第一个字符进行比较,ToggleCase为大小写字符转换,默认转换成小写
for (char* ps2 = ps1, *q = s2; *q; ps2++)
{//如果ps1的字符与s2的第一个字符相等,则进入二次判断,判断s2后续字符是否继续与ps1相等
if (*ToggleCase(ps2) != *ToggleCase(q))
break;
q++;
if (!*q)//如果*q=0,则证明str 是等于 strSearch,或者存在一段字符等于strSearch
return (char*)s1;
}
free(s1);//释放申请的堆空间
free(s2);
return NULL;//如果,字符串不一致,将返回一个NULL指针,
}
ToggleCase 大小写转换函数。
char* ToggleCase(char* p, int i = 1) {//大小写转换,i != 0 小写转换,i = 0 大写转换。默认小写转换。
if (i)
{
if (65 <= *p && *p <= 90) *p += 32;
}
else
{
if (97 <= *p && *p <= 122) *p -= 32;
}
return p;
}
验证:
由于微软的安全规划,在本函数中没有使用安全版本的函数调用,所以需要在头文件添加#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<cstdlib>
#include<cstring>
char* ToggleCase(char* p, int i = 1) {//大小写转换,i != 0 小写转换,i = 0 大写转换
if (i)
{
if (65 <= *p && *p <= 90) *p += 32;
}
else
{
if (97 <= *p && *p <= 122) *p -= 32;
}
return p;
}
char* StringMulti(const char* str, const char* strSearch) {
int n = 1;
for (char* p = (char*)str; *p; p++, n++);
char* s1 = (char*)malloc(n);
for (char* ps1 = s1; *str; str++) strcpy(ps1++, str);
n = 1;
for (char* p = (char*)strSearch; *p; p++, n++);
char* s2 = (char*)malloc(n);
for (char* ps2 = s2; *strSearch; strSearch++) strcpy(ps2++, strSearch);
for (char* ps1 = s1; *ps1; ps1++)
if (*ToggleCase(ps1) == *ToggleCase(s2))
for (char* ps2 = ps1, *q = s2; *q; ps2++)
{
if (*ToggleCase(ps2) != *ToggleCase(q))
break;
q++;
if (!*q)
return (char*)s1;
}
free(s1);
free(s2);
return NULL;
}
int main() {
char* p = StringMulti("一ABC", "一aBc");//大小写转换后对比
printf("大小写转换后对比,输出地址:%p,输出内容:%s\n", &p, p);
puts("");
p = StringMulti("abc", "dfe");//错误对比
printf("错误对比,输出地址:%p,输出内容:%s\n", &p, p);
return 0;
}