做gif有什么网站,镜像的网站怎么做排名,聊城手机网站建设公司,网站建设问卷调查#x1f525;引言 本篇将模拟实现字符串函数#xff0c;通过底层了解更多相关细节 #x1f308;个人主页#xff1a;是店小二呀 #x1f308;C语言笔记专栏#xff1a;C语言笔记 #x1f308;C笔记专栏#xff1a; C笔记
#x1f308;喜欢的诗句:无人扶我青云志 我自… 引言 本篇将模拟实现字符串函数通过底层了解更多相关细节 个人主页是店小二呀 C语言笔记专栏C语言笔记 C笔记专栏 C笔记
喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、模拟实现字符串函数1.1 模拟实现Strlen1.1.1 方法一1.1.2 方法二1.1.3 方法三 1.2 模拟实现Strcpy1.2.1方法一1.2.2 方法二 1.3 模拟实现Strcat1.4 模拟实现Strcmp1.5 模拟实现Strncpy1.6 模拟实现Strncat1.7 模拟实现Strncmp 1.8 模拟实现Strstr 一、模拟实现字符串函数 1.1 模拟实现Strlen
1.1.1 方法一
int main()
{char arr[] abcdef;int count 0;//用于计算累积数while (arr[count] ! \0)//\0是不在计算的范围{count;}printf(长度为%d\n, count);return 0;
}
1.1.2 方法二
int main()
{char arr[] abcdef;int tap 0;char* count arr;//标记字符串的首地址while (arr[tap] ! \0) // \0是不在计算的范围{tap;count;}printf(长度为%d, count - arr);//指针-指针等于它们的差值return 0;
}【说明】:
通过获得该字符串\0的位置运用**指针(\0的位置)-指针(首位置)**等于两个指针的差值
1.1.3 方法三
int pc(char* arr)
{assert(arr);//断言下if (*arr \0)//设计出口{return 0;}{return 1 pc(arr 1);}
}
int main()/
{char arr[] abcdef;printf(长值为%d, pc(arr));return 0;
}【说明】:
字符串可以考虑使用大事化小的思想递归观察变化的量得到等价关系 1.2 模拟实现Strcpy
1.2.1方法一
void my_strcpy(char* dest, const char* str)
{while (*str ! \0)//判断拷贝结束条件{*dest *str;//进行拷贝dest;str;}
}【说明】:
两个指针指向对应的字符串逐一拷贝虽然形参dest和str是指针变量形参不会影响到实参这里dest传递过来是地址(数组名)对此可以修改dest指向的字符串dest指向的字符串需要被修改但是src指向字符串不希望被修改
1.2.2 方法二
char* my_strcpy(char* dest, const char* str
{assert(dest ! NULL);assert(str ! NULL);char* ret dest;//标记初始地址while (*dest *str)//判断和后置打配合{}return ret;
}【说明】:
这里实现逻辑跟方法一类似只是这里循环判判断条件不同在循环判断语句中完成拷贝赋值操作当str指针指向\0的位置则表示循环结束\0的ASCII码值是0为假 1.3 模拟实现Strcat
char* my_strcat(char* p, const char* pc)
{assert(p ! NULL);assert(pc ! NULL);char* ret p;///标记初始地址while (*p ! \0)//找到目标字符串的结束标记{p;}while (*p *pc)//在结束标记的位置上追加直到pc找到\0{}return ret;///返回初始地址
}【说明】:
第一次循环:找到目标字符串的结束标记第二次循环:在结束标记的位置上追加直到pc找到’\0’完成追加操作 1.4 模拟实现Strcmp
int my_strcmp(const char* p, const char* pc)
{assert(p ! NULL);assert(pc ! NULL);while (*p *pc)//不相等才要对比{if (*p \0)//找到结束位置了说明两个字符串是相等的{return 0;}p;pc;}return *p - *pc;//用四则运算判断正负
}【说明】:
循环判断是否相同相同继续向后寻找不相等则通过四则运算判断正负 1.5 模拟实现Strncpy
char* my_strncpy(char* p, const char* pc, int sz)
{assert(p ! NULL);assert(pc ! NULL);char* ret p;//标记初始地址while (sz--)//拷贝次数{*p *pc;//拷贝开始啦p; pc;}return ret;//返回初始地址
}【说明】:
跟模拟实现strcpy逻辑类似只是通过一个变量控制循环次数 1.6 模拟实现Strncat
char* my_strncat(char* p, const char* pc, int sz)
{assert(p ! NULL);assert(pc ! NULL);char* ret p;//标记初始地址while (*p ! \0)//找到目标字符串的结束标记{p; }while (sz)//追加次数注意上篇文章可能的问题{*p *pc;p;pc;sz--; }return ret;//返回初始地址
}【说明】:
跟模拟实现strcat逻辑类似只是通过一个变量控制循环次数 1.7 模拟实现Strncmp
int my_strncmp(const char* p, const char* pc, int sz)
{assert(p ! NULL);assert(pc ! NULL);while (*p *pc sz--)//注意不同就是次数作为判断条件{if (*p \0)//找到结束位置了说明两个字符串是相等的{return 0;}p;pc;}return *p - *pc//用四则运算判断正负}【说明】:
跟模拟实现strcmp逻辑类似只是通过变量控制循环次数和是否不出现不相等 1.8 模拟实现Strstr
char* my_strstr(char* p, char* pc)
{assert(p pc);char* dest p;//标记初始地址char* str pc;//标记初始地址if (*pc \0)//如果是空字符就没有不要了{return p; }while (*dest)//字符串寻找子字符串的次数{while (*p *pc *p *pc)//实现逻辑{p;pc;if (*pc \0)//子字符串都对应上了{return dest;//找到位置的指针返回}}pc str;//上面可能找到子字符串了但是可惜不是回归子字符串的地址 dest;p dest;//dest的位置推进地毯式搜索}if (*dest \0)//匹配完找不到子字符串{return NULL;}
} 【说明】:
假设原字符串是ccpd目标字符串cp当匹配第一个字符时可能后继都是匹配的也可以只是部分匹配对此需要记录这个匹配位置通过内循环遍历一次判断是否匹配如果从这个位置不匹配则推进一位继续循环(暴力解法) 以上就是本篇文章的所有内容在此感谢大家的观看这里是店小二C语言笔记希望对你在学习C语言中有所帮助