首先我们了解到Strcpy的功能是将一串字符串粘贴到另一串字符串当中。首先我们要判断字符串中是否为空,空的话我们需要利用assert断言函数报警,当字符串不为空我们则需要将要复制得字符串src粘贴到des中去,并偏移位子。当然也可以设置粘贴内容的多少,我们再定义一个count函数,你要粘贴多少写多少让他自减,当然这其中还包含一种极端得情况,就是src提前出现‘\0’的时候,我们要增加des得位数让其匹配,并提前返回des。
#include<stdio.h>
#include <assert.h>
char* myStrcpy(char* des,char* src)
{
assert(des!=NULL && src!=NULL); //断言
char *bak=des;
while(*src!='\0'){
*des = *src;
des++;
src++;
}
*des='\0';
return bak;
}
char* myStrcpy2(char* des,char* src,int count)
{
if(des==NULL||src==NULL){
return NULL;
}
char *bak=des;
while(*src!='\0'&&count>0){
*des++ = *src++;
count--;
}
if(count>0){
while(count>0){
*des++='\0';
count--;
}
return des;
}
*des='\0';
return bak;
}
char* myStrcpy3(char* des,char* src)
{
if(des==NULL||src==NULL){
return NULL;
}
char *bak=des;
while((*des++ = *src++)!='\0'){
}
*des='\0';
return bak;
}
int main()
{
char str[128]={'\0'};
char *pstr= NULL;
char *p="taoyi zhen shuai";
//myStrcpy2(str,p,5);
myStrcpy(pstr,p);
puts(str);
return 0;
}
Strcat函数原理:首先呢也是用assert来判断,然后先让des位移到最后然后在将src赋值给des后面得位数,实现拼接。
#include<stdio.h>
#include<string.h>
#include <assert.h>
char* myStrcat(char *des,char *src)
{
assert(des!= NULL && src != NULL);
char *bak=des;
while(*des){ //'\0'对于while来说也是一个不成立的条件
des++;
}
while((*des++=*src++)!='\0');
*des='\0';
return bak;
}
char* myStrcat2(char *des,char *src)
{
char *bak=des;
strcat(des+strlen(des),src);
return bak;
}
char* myStrcat3(char *des,char *src)
{
assert(des!= NULL && src != NULL);
char *bak=des;
for(;*des!='\0';des++);
while((*des++=*src++)!='\0');
*des='\0';
return bak;
}
int main()
{
char str[128]="taoyi";
char *p=" handsome!";
char *p2;
p2=myStrcat(str,p);
//p2=Strcat(str,p);
puts(str);
puts(p2);
return 0;
}
Strcmp实现原理:他得功能时比较字符串的大小,原理主要是通过ascall码值进行判断,中间取==0的时候作为参照,不一样的时候在开始计算值。大返回1小返回-1相等返回0.
#include<stdio.h>
#include<string.h>
#include <assert.h>
int myStrcmp(char *str1,char *str2)
{
int ret=0;
int sum1=0;
int sum2=0;
char *bakStr1 = str1; //防止他成为野指针
char *bakStr2 = str2;
/*while(*str1){
sum1+=*str1;
str1++;
}
while(*str2){
sum2+=*str2;
str2++;
}
str1=bakStr1;
str2=bakStr2;*/
while(*str1&&*str2&&(*str1==*str2)){
str1++;
str2++;
}
if(*str1||*str2){
str1=bakStr1;
str2=bakStr2;
while(*str1){
sum1+=*str1;
str1++;
}
while(*str2){
sum2+=*str2;
str2++;
}
}
ret=sum1-sum2;
if(ret>0){
ret = 1;
}
if(ret<0){
ret = -1;
}
return ret;
}
int main()
{
char *a="taoyia";
char *b="taoyis";
int ret = myStrcmp(a,b);
//int ret = strcmp(a,b);
if(ret==0){
puts("两个字符串一样");
}
printf("ret=%d\n",ret);
return 0;
}