1. 程式人生 > >模擬實現:strlen,strcpy,strcat,strchr,ctrcmp,strstr

模擬實現:strlen,strcpy,strcat,strchr,ctrcmp,strstr

模擬實現幾個str庫函式的功能:

首先,應用的標頭檔案如下:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>

主函式如下,為了觀察結果更加清晰,我在程式碼裡順便分了一下顯示區域,並且每個模擬實現的函式都與其對應的庫函式結果進行了對比:


int main()
{
	char str1[] = { "abcdef" };
	char str2[30] = { "0" };
	char str3[30] = { "123456" };
	printf("str1=%s\nstr2=%s\nstr3=%s\n",str1,str2,str3);

	printf("************************************************\n");
	//My_strlen(str1);
	printf("My_strlen:\nMy_strlen1(str1):len(str)=%d\n", My_strlen1(str1));
	printf("My_strlen2(str1):len(str)=%d\n", My_strlen2(str1));
	printf("My_strlen3(str1):len(str)=%d\n", My_strlen3(str1));
	printf("strlen(str1):len(str)=%d\n", strlen(str1));
	printf("************************************************\n");

	//My_strcpy(str2, str1);
	printf("My_strcpy:\nMy_strcpy(str2,str1):str2=%s\n", My_strcpy(str2, str1));
	printf("strcpy(str2,str1):str2=%s\n", strcpy(str2, str1));
	printf("************************************************\n");

	//My_strcat(str3, str1);
	printf("My_strcat:\nMy_strcat(str3,str1):str3=%s\n", My_strcat(str3, str1));
	printf("strcat(str3,str1):str3=%s   ", strcat(str3, str1));
	printf("(在My_strcat的結果的基礎上再進行一次strcat!)\n");
	printf("************************************************\n");

	//My_strstr(str1,"bcd");
	printf("My_strstr:\nMy_strstr(str1,'bcd'):%s\n", My_strstr(str1, "bcd"));
	printf("strstr(str1,'bcd'):%s\n", strstr(str1, "bcd"));
	printf("************************************************\n");

	//My_strchr(str1,'d');
	printf("My_strchr:\nMy_strchr(str1, 'd'):%s\n", My_strchr(str1, 'd'));
	printf("My_strchr(str1, 'd'):%s\n", My_strchr(str1, 'h'));
	printf("strchr(str1, 'h'):%s\n", strchr(str1, 'd'));
	printf("strchr(str1, 'h'):%s\n", strchr(str1, 'h'));
	printf("************************************************\n");

	//My_strcmp(str1,str3);
	printf("My_strcmp:\nMy_strcmp(str1,str3):%d\n", My_strcmp(str3, str1));
	printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str3));
	printf("My_strcmp(str1,str3):%d\n", My_strcmp(str1, str2)); 
    //str2已被修改,此時str2=str1
	printf("strcmp(str1,str3):%d\n", strcmp(str3, str1));
	printf("strcmp(str1,str3):%d\n", strcmp(str1, str3));
	printf("strcmp(str1,str3):%d\n", strcmp(str1, str2));   //str2已被修改,此時str2=str1
	printf("************************************************\n");

	system("pause");
	return 0;
}

各部位程式碼:

1·strlen(求字串長度,這裡用了三種不同的方法):

int My_strlen1(char *str)     //方法1:計數器求strlen
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int My_strlen2(char *str)      //方法2:遞迴方法求strlen
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + My_strlen2(str+1);
}
int My_strlen3(char *str)           //方法3:尾指標-頭指標方法求strlen
{
	assert(str);
	char *p = str;
	while (*p != '\0')
	{
		p++;
	}
	return p - str;
}

2·strcpy(字串拷貝):

char *My_strcpy(char *dst, const char *src)
{
	assert(dst);
	assert(src);
	char *ret = dst;
	/*while (*dst=*src)
	{
		dst++;
		src++;
	}*/

	while (*dst++ = *src++)
	{
		;
	}
	//稍作改進
	return ret;
}

3·strcat(字串追加):

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

4·strstr(子字串查詢):

char *My_strstr(const char *str1, const char *str2)
{
	assert(str1);
	assert(str2);
	char *p_str1 = (char *)str1;
	char *p_str2 = (char *)str2;
	char *pc_str1=NULL;
	if (*str2=='\0')
	{
		return NULL;
	}
	while (*p_str1)
	{
		pc_str1 = p_str1;
		p_str2 = (char *)str2;
		while ((*pc_str1 == *p_str2)&&(*p_str2)&&(*pc_str1))
		{
			pc_str1++;
			p_str2++;
		}
		if (*p_str2 == '\0')
		{
			return p_str1;
		}
		p_str1++;
	}


	return NULL;
}

5·strchr(字元查詢):

char *My_strchr(char *str, int p)   //字元可轉為ASCLL值,故引數2可為int型別
{
	assert(str);
	assert(p);
	char *ret = str;
	while (*str)
	{
		if (*str == p)
			return str;
		else
			str++;
	}
	return NULL;
}

6.strcmp(字串比較):

int My_strcmp(const char *str1, const char* str2)   
//若引數1>引數2,返回1;若引數1<引數2返回-1;若相等,返回0
{
	assert(str1);
	assert(str2);
	while (*str1)
	{
		if (*str1 == *str2)
		{
			str1++;
			str2++;
		}
		else
			break;		
	}
	if ( (*(unsigned char *)str1 - *(unsigned char *)str2) > 0)
		return 1;
	else if ((*(unsigned char *)str1 - *(unsigned char *)str2) < 0)
		return -1;
	return 0;
}

顯示結果如下:

經過驗證,功能與庫函式功能基本一致。