学习笔记之C语言的断言函数assert,复制函数strcpy,strncpy,拼接函数strcat,比较函数strcmp

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.比较函数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 
#include 

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;
}

int main()
{
	//自己实现比较函数strcmp
	//strcmp函数比较机制,如果P1>p2.则返回1,如果相等则返回0,如果P1
	int ret;
	char *pstr1 = "helloniaoa";
	char *pstr2 = "helloniaoa";
	
	ret = myStrcmp(pstr1,pstr2);
    printf("Ret = %d\n",ret); 
	
	return 0;
}

以上便是自己实现strcpy,strcat,strcmp函数的学习笔记,仅供参考

你可能感兴趣的:(嵌入式软件工程师,c语言,开发语言)