1. 程式人生 > 其它 >strcpy、strcmp、strlen、strcat函式的模擬實現

strcpy、strcmp、strlen、strcat函式的模擬實現

技術標籤:c++

常見字串函式的模擬實現


strlen

size_t strlen( const char *string );
  • sizeof 區別開來。sizeof是求字串的大小,會將 '\0’也算進大小,strlen函式是求字串的長度,長度不包含 ‘\0’
  • 引數指向的字串必須要以 ‘\0’ 結束
  • 注意函式的返回值為size_t,是無符號整型
size_t my_strlen(const char *string)
{
	assert(string);               //檢查合法性
	char
*str = (char*)string; //保護引數 size_t len = 0; while (*str) { str++; len++; } return len; } int main() { char *str = "abcdefghijklmnopqrstuvwxyz"; //26個英文字母噢兄弟們,不是24個哈哈哈,我是有證據的,看下面 int ret = my_strlen(str); printf("str length = %d\n", ret); return 0; }

在這裡插入圖片描述
在這裡插入圖片描述


strcpy

char *
strcpy( char *strDestination, const char *strSource );
  • 返回值是目標空間的首地址
  • 源字串必須以‘\0’結尾,並且strcpy函式會將‘\0’一併複製到目標空間
  • 目標空間必須是可變的
  • 目標空間必須足夠放下源字串(注意包含‘\0’的長度)
char *my_strcpy(char *strDestination, const char *strSource)
{
	assert(strDestination && strSource);    //檢查合法性

	char *dest = (char*)strDestination;     //保護引數
char *src = (char*)strSource; while (*src) //相當於while(*src != '\0') { *dest = *src; dest++; src++; } *dest = '\0'; //給目標空間結尾加字串結束標誌 return strDestination; } int main() { char str1[80]; char *str2 = "abcdefghijklmnopqrstuvwxyz"; my_strcpy(str1, str2); printf("%s\n",str1); return 0; }

strcmp

int strcmp( const char *string1, const char *string2 );
  • 第一個字串**大於**第二個字串,則返回大於0的數字
  • 第一個字串**等於**第二個字串,則返回0
  • 第一個字串**小於**第二個字串,則返回小於0的數字
int my_strcmp(const char *string1, const char *string2)
{
	assert(string1 && string2);          //檢查合法性

	char *str1 = (char*)string1;         //保護引數
	char *str2 = (char*)string2;
	
	int size1 = strlen(str1);            //判斷長度
	int size2 = strlen(str2);
	if (size1 > size2)
		return 1;
	else if (size1 < size2)
		return -1;
	
	while (*str1)  //經過前面的判斷長度之後,能執行到這裡肯定是兩字串長度相等的情況
	{
		int ret = 0;
		ret = *str1 - *str2;
		if (ret > 0)
			return 1;
		else if (ret < 0)
			return -1;
	}
	return 0;
}

int main()
{
	char *str1 = "bbcd";
	char *str2 = "abcd";
	int ret = my_strcmp(str1, str2);
	if (ret == 1)
		printf("str1 > str2\n");
	if (ret == 0)
		printf("str1 = str2\n");
	if (ret == -1)
		printf("str1 < str2\n");

	return 0;
}

strcat

char *strcat( char *strDestination, const char *strSource );
  • 返回值是目標空間的首地址,所以進行引數保護是必要的
  • 源字串必須以‘\0’結尾,並且strcat函式會將‘\0’一併連結到目標空間的尾部
  • 目標空間必須是可變的
  • 目標空間必須足夠放下源字串(注意包含‘\0’的長度)
char *my_strcat(char *strDestination, const char *strSource)
{
	assert(strDestination && strSource);         //檢查合法性

	const char *src = (const char*)strSource;    //保護引數
	char *dest = (const char*)strDestination;
	char *pdest = dest;
	while (*pdest != '\0')       // 找到目標空間的尾部,即目標空間'\0'的位置
	{
		pdest++;
	}
	while (*src != '\0')        //在目標空間的'\0'位置連結
	{
		*pdest = *src;
		src++;
		pdest++;
	}
	*pdest = '\0';           //給目標空間結尾加字串結束標誌
	return strDestination;
}

int main()
{
	char str1[18] = { "abcdefghijk" };
	char *str2 = "oooooo";
	char *pdest = my_strcat(str1, str2);
	printf("%s\n", pdest);
	return 0;
}

在這裡插入圖片描述
Ohhhhhhhhhhhhhhhhhhhhhhhhhhh!!!!他…他合體了