字串相關函式的實現

audience_fzn發表於2018-08-03

1.strlen():求字串長度函式,遇到'\0'結束

函式原型:size_t strlen(const char * str)

引數指向的字串必須以‘\0’結尾

返回值size_t是無符號的

1)使用一個計數器

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

2)用遞迴的方法

int my_strlen(const char* str)
{
	if (*str=='\0')
		return 0;
	else
		return 1 + my_strlen(str+1);
}

3)使用指標-指標的方法

int my_strlen(char* str)
{
	char *p = str;
	while (*p != 0)
		p++;
	return p - str;
}

2.strcpy()函式:字串拷貝函式

函式原型:char* strcpy(char * destination,const char * source)

注意事項:

  • 源字串必須以‘\0’結束
  • 會將源字串中的‘\0’拷貝到目標空間
  • 目標空間必須足夠大
  • 目標空間必須可變
char* my_strcpy(char* dest, const char* src)
{
	char *ret = dest;
	assert(dest!=NULL);
	assert(src!=NULL);
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

3.strcat():字串拼接函式,將倆個字串拼接成一個

函式原型:char* strcat(char * destination,const char * source)

注意事項:

  • 源字串必須以‘\0’結束
  • 目標空間必須足夠大
  • 目標空間必須可修改
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

4.strcmp()字串比較函式,第一個字串比第二個大,返回1,相當返回0,第一個比第二個小返回-1;

int my_strcmp(const char* str1,const char* str2)
{
	int ret = 0;
	while (!(ret = *(unsigned char*)str1 - *(unsigned char*)str2)&& *str2)
	{
		++str1;
		++str2;
	}

	if (ret < 0)
		ret = -1;
	if (ret > 0)
		ret = 1;
	return (ret);
}

5.模擬實現strstr(),字串查詢函式,在str1中找子串str2

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);

	char *cp = (char*)str1;
	char *substr = (char*)str2;
	char *s1 = NULL;

	if (*str2 == '\0')
		return NULL;

	while (*cp)
	{
		s1 = cp;
		substr = str2;
		while (*s1 && *substr && (*s1 == *substr))
		{
			s1++;
			substr++;
		}
		if (*surstr == '\0')
			return cp;
		cp++;
	}
}

 

相關文章