字符串相关函数的模拟实现

要模拟库函数的实现,必须要搞清楚的是在程序调用中它的实现原理是什么,接下来就讲解几个字符串相关的函数,比如strcmp(),strncmp(),strcat(),strncat()......

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、成都微信小程序、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了曲江免费建站欢迎大家使用!


字符串函数主要包括受限制字符串函数与不受限制字符串函数,那么什么是受限制字符串函数与不受限制字符串函数呢?!简单来讲,不受限制字符串函数就是使用这些函数时,它们只是通过字符串结尾的NULL 字符来确定字符串的长度,例如我们常用的strcmp(),strcpy();而受限制的字符串函数就是这些函数她们接受一个显示的长度参数,来限定要复制或者比较的字符个数,例如strncmp(),strncpy(),这里边的n在函数名和函数传参中都有,n即为要操作的字符个数。


一、不受限制字符串函数

1.strcpy()

库函数原型:char*strcpy(char*strDestination,constchar*strSource );

实现:将拷贝的字符串str2一个一个拷贝到字符数组str1中,直到字符数组遇到‘\0’结束标志后拷贝完成。在拷贝时,str2中的'\0'一同被拷贝。

char *my_strcpy(char *str1,const char *str2)
{
	char *start = str1;        //保存字符数组2的首地址
	assert(str1);
	assert(str2);
	while(*str1++ =  *str2++)
	{
		;
	}
	return start;
}


2.strlen()

库函数原型:size_tstrlen(constchar*string );

实现:在遇到'\0'之前,指针每向后挪动一次,计数器加一次

int my_strlen(const char *str1)
{
	int count = 0;
	assert(str1);
	while(*str1++)
	{
		count++;
		//str1++;
	}
	return count;
}

3.strcmp()

库函数原型:intstrcmp(constchar*string1, constchar*string2 );

比较规则:两个字符串自左向右逐个字符比较(按ASCII码的值比较),知道出现不同的字符或者遇到‘\0’。

(1)如果字符全部相等,则两个字符串相等;

(2)如果出现不同的字符,则以第一对不相同字符的比较结果为准。

比较的结果由函数值带回:

(1)字符串1 = 字符串2,返回0;

(2)字符串1 > 字符串2 ,返回一个正整数;

(3)字符串1 < 字符串2,返回一个负整数。

int my_strcmp(const char *str1,const char *str2)
{
	assert(str1);
	assert(str2);
	while(*str1 == *str2)
	{
		if(*str1 != '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

4.strcat()

库函数原型:char*strcat(char*strDestination,constchar*strSource );

实现:指针指到字符数组1 的结尾时,将字符串2 中的字符一个一个追加到字符数组1 的后面,指针向后挪一次,字符拷贝一个,直到字符数组1 遇到‘\0’时追加完毕。(字符数组1 要足够大,能把字符串2 都添加进去)

char *my_strcat(char *str1,const char *str2)
{
	char *start = str1;    //保存字符数组的首地址
	assert(str1);
	assert(str2);
	while(*str1)
	{
		str1++;
	}
	while(*str2)
	{
		*str1 = *str2;
		str1++;
		str2++;
	}
	*str1 = '\0';
	return start;
}

5.strstr()

库函数原型:char*strstr(constchar*string,constchar*strCharSet );

实现:在字符串str1 中找子字符串str2,如果能找到,就返回子串的起始位置,如果找不到,就返回NULL

char *my_strstr(const char *str, const char *substr)
{
	const char *str1 = str;
	const char *str2 = substr;
	const char *start = NULL;         
	assert(str);
	assert(substr);
	if(*str2 == '\0')
		return (char *)str1;
	while(*str1)
	{
		start = str1;           //找到的第一个字符保存
		while(*str1 && *str2 && *str1 == *str2)
		{
			str1++;
			str2++;
		}
		if(*str2 == '\0')
			return (char *)start;
		str1 = start + 1;
		str2 = substr;
	}
	return NULL;
}

二、受限制字符串函数

1.strncat()

原型:char*strncat(char*strDest,constchar*strSource,size_tcount );

count为要追加的字符个数

char *my_strncat(char *str1,char *str2,size_t n)
{
	char *start = str1;      //保存字符数组1 的起始地址
	assert(str1);
	assert(str2);
	while(*str1)
	{
		str1++;
	}
	while(n)
	{
		*str1 = *str2;
		str1++;
		str2++;
		n--;
	}
	*str1 = '\0';
	return start;
}

2.strncmp()

函数原型:char*strncpy(char*strDest,constchar*strSource,size_tcount );

int my_strncmp(const char *str1,const char *str2,size_t n)
{
	assert(str1);
	assert(str2);
	while(n && *str1 && *str1 == *str2)
	{
		if(*str1 != '\0')
			return 0;
		str1++;
		str2++;
		n--;
	}
	return *str1 - *str2;
}

3.strncpy()

库函数原型:char*strncpy(char*strDest,constchar*strSource,size_tcount );

char *my_strncpy(char *str1,char *str2,size_t n)
{
	char *start = str1;
	assert(str1);
	assert(str2);
	while((n--) && (*str1++ = *str2++))
	{
		//*str1++ = *str2++;
		//n--;
	}
	*str1 = '\0';
	return start;
}



分享名称:字符串相关函数的模拟实现
转载来于:http://ybzwz.com/article/pcojhj.html