1.断言函数assert
(笔试时可能会考到)
assert的头文件是
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
其实assert的用法有点像if语句,例如
assert(str != NULL && des != NULL);//当满足括号中的条件时才执行下面的程序
只有当括号里的条件为真是才进行下面代码的执行,如果为假(即0),则输出一条错误信息在终止程序执行。
2.自己实现复制函数strcpy
strcpy函数的头文件是<string,h>
char *pstr = "str";
char str[128] = {'\0'};
strcpy(str,pstr);
printf("%s\n",str);
strcpy函数直接输出前面那个字符串即可,不需要再另外定义一个字符串接收strcpy的返回
接下来自己实现strcpy
函数
方式一:
char *myStrcpy(char* str,char* des)
{
char* dek = str;
//断言函数assert使用类似于myStrcpy中的if用法
assert(str != NULL && des != NULL);//当满足括号中的条件时才执行下面的程序
while(*des != '\0')
{
*str = *des;
str++;
des++;
}
*str = '\0';
return dek;
}
方式二:
char *myStrcpy2(char* str,char* des)
{
char* dak = str;
if(str == NULL || des == NULL)
{
return NULL;
}
while( *des != '\0')
{
*str++ = *des++;//此处的意思是先取内容赋值了再进行地址的偏移
}
return dak;
}
方式三(实现的是strncpy
):
strncpy
意思是复制指定数量的字符
char *myStrncpy(char* str,char* des,int count)
{
//count是要复制的字符串的个数
char* dak = str;
assert(str != NULL && des != NULL);
while(*des != '\0' && count > 0)
{
*str = *des;
str++;
des++;
count--;
}
*str = '\0';
return dak;
}
其实以上的实现方式都是换汤不换药的
总的代码实现:
#include
#include
#include
char *myStrcpy(char* str,char* des)
{
char* dek = str;
//断言函数assert使用类似于myStrcpy中的if用法
assert(str != NULL && des != NULL);//当满足括号中的条件时才执行下面的程序
while(*des != '\0')
{
*str = *des;
str++;
des++;
}
*str = '\0';
return dek;
}
char *myStrcpy2(char* str,char* des)
{
char* dak = str;
if(str == NULL || des == NULL)
{
return NULL;
}
while( *des != '\0')
{
*str++ = *des++;//此处的意思是先取内容赋值了再进行地址的偏移
}
return dak;
}
char *myStrncpy(char* str,char* des,int count)
{
//count是要复制的字符串的个数
char* dak = str;
assert(str != NULL && des != NULL);
while(*des != '\0' && count > 0)
{
*str = *des;
str++;
des++;
count--;
}
*str = '\0';
return dak;
}
int main()
{
//自己实现strcpy与strncpy函数
char *pstr = "hello lianghanbiao";
char *des;
des = (char *)malloc(128*sizeof(char));
char str[128] = {'\0'};
myStrcpy(des,pstr);
myStrncpy(str,pstr,6);
puts(str);
printf("%s\n",des);
return 0;
}
3.拼接函数strcat
的实现
同样头文件也是
char *pstr = "liang";
char *str = "han";
strcat(pstr,str);
puts(pstr);
同样strcat 函数也是不需要有字符串来接收它的返回,直接输出被拼接的那个字符串即可
实现方式一:
char* myStrcat(char* pstr,char* str)
{
char* dak = pstr;
assert(pstr != NULL && str != NULL);
while(*pstr != '\0')
{
pstr++;//先让被拼接的字符串跑到后面去,再拼进去
}
while(*str != '\0')//此处应该判断拼接的字符串是否跑到最后,跑到最后的话结束拼接
{
*pstr = *str;
pstr++;
str++;
}
*pstr = '\0';
return dak;
}
方式二:
char* myStrcat2(char* pstr,char* str)
{
char* dat = pstr;
assert(pstr != NULL && str != NULL);
for(;*pstr != '\0';pstr++);//先让被拼接的字符串跑到最后去
while(*str != '\0')
{
*pstr++ = *str++;//切记此处的是先取内容赋值后再进行指针地址的偏移
}
return dat;
}
方式三 :
char* myStrcat3(char* pstr,char* str)
{
//流氓写法
char* dat = pstr;//首先定义一个指针来保存指针pstr的首地址;
strcpy(pstr+strlen(pstr),str);//此时是将str的内容拼接到strlen(pstr)的内存里
//上面这样写的话需要保证pstr空间足够大
return dat;
}
总的代码的实现:
#include
#include
#include
char* myStrcat(char* pstr,char* str)
{
char* dak = pstr;
assert(pstr != NULL && str != NULL);
while(*pstr != '\0')
{
pstr++;//先让被拼接的字符串跑到后面去,再拼进去
}
while(*str != '\0')//此处应该判断拼接的字符串是否跑到最后,跑到最后的话结束拼接
{
*pstr = *str;
pstr++;
str++;
}
*pstr = '\0';
return dak;
}
char* myStrcat2(char* pstr,char* str)
{
char* dat = pstr;
assert(pstr != NULL && str != NULL);
for(;*pstr != '\0';pstr++);//先让被拼接的字符串跑到最后去
while(*str != '\0')
{
*pstr++ = *str++;//切记此处的是先取内容赋值后再进行指针地址的偏移
}
return dat;
}
char* myStrcat3(char* pstr,char* str)
{
//流氓写法
char* dat = pstr;//首先定义一个指针来保存指针pstr的首地址;
strcpy(pstr+strlen(pstr),str);//此时是将str的内容拼接到strlen(pstr)的内存里
//上面这样写的话需要保证pstr空间足够大
return dat;
}
int main()
{
//通过自己实现strcat(拼接)函数
char pstr[128] = "hello";
char *pstr1 = " lianghanbiao";
/*myStrcat2(pstr,pstr1);
printf("%s\n",pstr);*/
//myStrcat(pstr,pstr1);
myStrcat3(pstr,pstr1);
puts(pstr);
return 0;
}
三种方式同样是换汤不换药的,用类比法即可
4.比较函数 实现方式: 总的代码实现: 以上便是自己实现strcpy,strcat,strcmp函数的学习笔记,仅供参考strcmp
的实现
strcmp
函数不同于上面几个,这个需要有一个整型的变量来接收函数返回的数值,其实质就是比较两串字符串的ASII码值的大小,strcmp(p1,p2)
,如果p1>p2,则返回1,如果p1 int ret;
char *pstr1 = "helloniaoa";
char *pstr2 = "helloniaoa";
ret = myStrcmp(pstr1,pstr2);
printf("Ret = %d\n",ret);
int myStrcmp(char* str1,char* str2)
{
int ret = 0;
int sum_str1 = 0;
int sum_str2 = 0;
char *n_str1;
char *n_str2;
n_str1 = str1;//这里分别将str1和str2的首地址赋给指针n_str;
n_str2 = str2;
/*while(*str1 && *str2 && (*str1 == *str2))//此处的*str1和*str2是代表不是‘\0’的意思
{
str1++;
str2++;
}
*/
if(*str1 || *str2)//如果指针str都不等于‘\0’的时候
{
str1 = n_str1;
str2 = n_str2;
while(*str1)
{
sum_str1 += *str1;
str1++;
}
while(*str2)
{
sum_str2 += *str2;
str2++;
}
}
ret = sum_str1 - sum_str2;//此时进行的是字符串的ASII码的运算
if(ret > 0)
{
ret = 1;
}
if(ret < 0)
{
ret = -1;
}
if(ret == 0)
{
ret = 0;
}
return ret;
}
#include