模拟实现字符串和内存操作函数(一):strlen, strcmp, strcpy, strcat, strchr, strstr

模拟实现字符串和内存操作函数(一)目录:


strlen

size_t strlen(const char* str)

  • 字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含’\0’)。
  • 参数指向的字符串必须要以‘\0’结束。
  • 函数的返回值为size_t,是无符号类型。
  • 因为是模拟库函数,所以为了防止调用者放入空指针或者防止传入的字符串被修改,下面的函数中会用到assert函数和const。
size_t my_strlen(const char* p)
{
	size_t count = 0;
	assert(p != NULL);
	while (*p)
	{
		count++;
		p++;
	}
	return count;
}

strcpy

char* strcpy(char* dst,const char* src)

  • strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。
  • 源字符串必须以’\0’结束
  • 会将源字符串的’\0’拷贝到目标空间
  • 目标空间必须可变,并且具有足够大的空间来存放源字符串
char* my_strcpy(char* dst, const char* src)
{
	char* str = dst;
	assert(dest && src);
	while (*dest++ = *src++);
	//当指针指向位置为'\0'时结束拷贝
	return str;
}


strcat

char* strcat(char* dst,const char* src)

  • strcat把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面。
  • 源字符串必须以’\0’结束
  • 会将源字符串的’\0’拷贝到目标空间
  • 目标空间必须可变,并且具有足够大的空间来存放源字符串
char* my_strcat(char* dst, const char* src)
{
	assert(dst && src);
	char* str = dst;
	while (*dst)
	{
		dst++;
	}
	//找到dst的结束位置
	while (*dst++ = *src++);
	//在末尾拼接src
	*dst = *src;
	//拷贝src的'\0'
	return str;
}

strcmp

int my_strcmp(const char* str1, const char* str2)

  • strcmp两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
  • 源字符串必须以’\0’结束
  • 当str1<str2时,返回为负数,
  • 当str1=str2时,返回值= 0
  • 当str1>str2时,返回为正数
  • 需要将类型强转为unsighed char* ,因为对比的是ASCII码值,但是当大于127时会自动将其按照补码的形式转换为负数,则会产生错误
int my_strcmp(const char* str1, const char* str2)
{
	unsigned char* s1 = (unsigned char* )str1;
	unsigned char* s2 = (unsigned char* )str2;
	while (*s1 && *s2)
	{
		if (*s1 < *s2)
			return -1;
		else if (*s1 > *s2)
			return 1;
		else
		{
			s1++;
			s2++;
		}
	}
	
	if ('\0' == *s1 && '\0' == *s2)
		return 0;
	else if ('\0' == *s1)
		return -1;
	else
		return 1;
	//当两边字符数不相同的时候进行判断
}

strstr

char* my_strstr(const char* src, const char* sub)

  • strstr返回一个指针,指向sub在src中首次出现的位置。
char* my_strstr(const char* src, const char* sub)
{
	assert(src && sub);
	const char* src1 = src;
	const char* sub1 = sub;

	while (*src1)
	{
		while (*src1 == *sub1 && *sub1)
		{
			src1++;
			sub1++;
		}
		if ('\0' == *sub1)
		{
			return src;
		}
		//当*sub1指向'\0'时,说明sub1和src1完全相同,此时返回src
		else
		{
			sub1 = sub;
			src1 = ++src;
		}
		//如果不同,则sub1回溯,*src1继续走向下一个位置
	}
	return NULL;

}

strchr

char* strchr(char* dst,const char* src)

  • strchr返回一个指向该字符串中第一次出现的字符的指针,如果字符串中不包含该字符则返回NULL空指针。
char* my_strchr(const char* str,const char c)
{
	assert(str);
	while (*str)
	{
		if (*str == c)
			return str;
		else
			str++;
	}
	return NULL;
}
发布了60 篇原创文章 · 获赞 78 · 访问量 6322

猜你喜欢

转载自blog.csdn.net/qq_35423154/article/details/103131169
今日推荐