天天看點

模拟實作strcpy,strcmp,strcat,strstr.strlen

strcpy函數實作

strcpy :字元串拷貝函數,  函數原型 char* strcpy(char* dest,char* src)    從stc的起始位址開始,到'\0'結束。 是以dest必須有足夠的空間來容納src。頭檔案#include<string.h>

char* my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	while ((*dest++) = (*src++))
	{
		;
	}
	return ret;
}
           

測試部分

int main()
{
	char arr[20];
	char* str= "hello ";
	char* ret = my_strcpy(arr, str);
	printf("%s\n", ret);
	system("pause");
	return 0;
}
           

strcat函數實作

strcat :字元串連接配接函數 ,把src指向的字元串添加到dest後,(src直接覆寫dest結尾處的‘\0’)  原型  char* strcat(char *dest,const char* src);   頭檔案#include<string>  注意事項: dest和src倆塊空間不能有重疊部分,dest必須有足夠大的空間來容納srt,傳回dest的指針

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	while (*dest)
	{
		*dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
           

測試部分

int main()
{
	char arr1[20] = "hello";
	char arr2[] = "sust";
	char* ret = my_strcat(arr1, arr2);
	printf("%s\n", ret);
	system("pause");
	return 0;
}
           

arr1 的空間一定要足夠大

strcmp函數實作

strcmp:字元串比較函數,倆個字元串自左向右逐個字元比較(按ASCIIZ值的大小比較)直到出現不同的字元或者‘\0’。若這倆個字元串為str1,str2,             若str1==str2,傳回0;             若str1>str2 ,傳回正數;             若str1<str2,傳回負數;                  

int my_strcmp(const char* dest,const char* src)
{
	int ret = 0;
	while (*dest == *src)
	{
		if (*dest == '\0')
		{
			return 0;
		}
		*dest++;
		*src++;
	}
	return *dest - *src;
}
           

測試 

int main()
{
	char arr1[10] = "sust";
	char arr2[10] = "sust";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
           

strstr函數實作

 strstr:在字元串中找子串   char* strstr(char* str1,char * str2)  在str1中找str2,如果找到了傳回strp2在str1中首次出現的位址,如果沒找到傳回NULL。

char* my_strstr(const char* str1, const char* str2)
{
	char *cp = (char*)str1;
	char *substr = (char*)str2;
	char *s1 = str1;
	assert(str1);
	assert(str2);
	if (*str2 == '\0')
		return NULL;
	while (*cp)
	{
		s1 = cp;
		substr = str2;
		while (*s1&&*substr && (*s1 == *substr))
		{
			s1++;
			substr++;
		}
		if (*substr == '\0')
			return cp;
		cp++;
	}
}
           

strlen函數實作

strlen:求字元串長度函數,從開始直到遇到'\0'結束,傳回計數器的值不包含‘\0 ’;

法一:

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

法二:遞歸法

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

測試

int main()
{
	char arr[10] = "hello";
	int ret = my_strlen(arr);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
           

繼續閱讀