1. 程式人生 > >C語言-----string.h標頭檔案中相關字串函式的模擬實現

C語言-----string.h標頭檔案中相關字串函式的模擬實現

strlen:

用途:Get the length of a string.獲取字串長度。

函式原型:size_t strlen( const char *string ); size_t表示無符號的意思,長度值肯定是無符號的。
  • 源字串以'\0'作為結束標誌。
  • strlen函式返回的是在字串中'\0'前面出現的字元個數(不包括'\0')
  • 返回值是無符號的,不能作減法。
模擬實現:
int my_strlen(const char *str)
{
	int count = 0;
	assert(str != NULL);
	while (*str != '\0')//源串以'\0'位結束標誌,不是'\0'就一直進入迴圈
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	int ret = 0;
	char arr[] = "abcdef";
	ret = my_strlen(arr);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
strcpy :用途:Copy a string.字串拷貝函式原型:char *strcpy( char *strDestination, const char *strSource );
  • 會將'\0'拷貝到目標空間,目標空間必須足夠大,可以存放源字串
  • 目標空間必須足夠大,可以存放源串
模擬實現:
char* my_strcpy(char *dest, const char *src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char *ret = dest;
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{

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

strncpy:

長度受限制的字串拷貝。函式原型:char *strncpy( char *strDest, const char *strSource, size_t count );
  • 拷貝count個字元從源串到目標空間
  • 如果源串的長度小於count,則拷貝完源串後再目標的後邊追加0,直到count個

模擬實現:

char *my_strncpy(char *arr, char *str, int count)
{
	assert(str);
	char *ret = arr;
	while (count--)
	{
		(*arr++) = (*str++);
	}
	*arr = '\0';
	return ret;
}
int main()
{
	char arr[] = " ";
	printf("%s\n", my_strncpy(arr, "abcdef",4));
	system("pause");
	return 0;
}
strcmp:

用途:Compare strings.

函式原型:int strcmp( const char *string1, const char *string2 );
  • 如果string1大於string2,返回大於0的數字
  • 如果string1等於string2,返回0
  • 如果string1小於string2,返回小於0 的數字
模擬實現:
int my_strcmp(const char *str1, const char *str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 < *str2)
		return -1;
	else if (*str1 > *str2)
		return 1;
	/*return *str1 - *str2;*/
}
int main()
{
	char *str1 = "aaaaaaaa";
	char *str2 = "aaasdffg";
	int ret = my_strcmp(str1, str2);
	printf("%d\n", ret);
	system("pause");
	return 0;
}
strncmp:長度受限制的字串比較函式原型:int strncmp( const char *string1, const char *string2, size_t count );
  • 比較到出現兩個字元不一樣或者一個字串結束或者count個字元全部比較完。
int my_strncmp(const char *str1, const char *str2, int count)
{
	assert(str1);
	assert(str2);
	while (count--)
	{
		if (*str1 == *str2)
		{
			str1++;
			str2++;
		}
		else
		{
			if (*str1 < *str2)
				return -1;
			else if (*str1 > *str2)
				return 1;
		}
	}
	return 0;
}
int main()
{
	char *str1 = "aabcded";
	char *str2 = "aadcdrfg";
	printf("%d\n", my_strncmp(str1, str2, 4));
	system("pause");
	return 0;
}

strcat:

用途:Append a string.字串連線

函式原型:char *strcat( char *strDestination, const char *strSource );
  • 源字串以'\0'結束
  • 目標空間必須足夠大,可以容納源串的內容。
  • 目標空間必須可修改
模擬實現:
char* my_strcat(char *dest, const char *src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr[] = "abc";
	printf("%s\n", my_strcat(arr, "defgh"));
	system("pause");
	return 0;
}
strchr:用途:Find a character in a string. 在字串str中查詢字元ch第一次出現的位置。函式原型:char *strchr( const char *string, int c );模擬實現:
char* my_strchr(const char *str, int ch)
{
	assert(str);
	while (*str && (*str != (char)ch))
		str++;
	if (*str == (char)ch)
		return (char *)str;
	return NULL;
}
int main()
{
	char *str = "abcdef";
	printf("%s\n", my_strchr(str, 'a'));
	system("pause");
	return 0;
}
strrchr:用途:Scan a string for the last occurrence of a character.在string中查詢字元ch最後一個出現的位置函式原型:char *strrchr( const char *string, int c );模擬實現:
char *my_strrchr(char *str, int ch)
{
	assert(str);
	while (*str++)
		;
	while (--str && (*str != (char)ch))
		;
	if (*str == (char)ch)
		return (char *)str;
	return NULL;
}
int main()
{
	char *str = "abcdefasd";
	printf("%s\n", my_strrchr(str, 'a'));
	system("pause");
	return 0;
}

strstr:用途:Find a substring.函式原型:char *strstr( const char *string, const char *strCharSet );模擬實現:
char* my_strstr(const char *str, const char * substr)
{
	assert(str != NULL);
	assert(substr != NULL);
	while (*str != '\0')
	{
		const char *s1 = str;
		const char *s2 = substr;
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)str;
		}
		str++;
	}
	return NULL;
}
int main()
{
	char *p = "abbbbcefd";
	char *string = "bbc";
	char *ret = my_strstr(p, string);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	system("pause");
	return 0;
}
strncat:

用途:Append characters of a string.

函式原型:char *strncat( char *strDest, const char *strSource, size_t count );模擬實現:
char *my_strncat(char *arr, char *str, int count)
{
	assert(arr&&str);
	char *ret = arr;
	while (*arr != '\0')
		arr++;
	while (count--)
	{
		*arr++ = *str++;
	}
	*arr = '\0';
	return ret;
}
int main()
{
	char arr[] = "ab";
	printf("%s\n", my_strncat(arr, "cdefgh", 4));
	system("pause");
	return 0;
}

接下來我們看一下string標頭檔案中幾個不太常見的函式:

strpbrk:函式原型:char *strpbrk( const char *string, const char *strCharSet );
  • 返回第一個字串中第一個出現在第二個字串中的字元的地址。
  • 測試一下:
int main()
{
	char *p = "abcdef123hujkl";
	char *p1 = "huhuhu1jij";
	printf("%s\n", strpbrk(p, p1));
	system("pause");
	return 0;
}
  • 結果:
strspn:函式原型:size_t strspn( const char *string, const char *strCharSet );
  • 返回的是string字串中開始部分匹配strCharSet字串中字元的個數。
  • 測試一下:
int main()
{
	char *p = "huhuabcdef123hujkl";
	char *p1 = "huhuhu1jij";
	printf("%d\n", strspn(p, p1));
	system("pause");
	return 0;
}
  • 結果:
strcspn:
函式原型:size_t strcspn( const char *string, const char *strCharSet );
  • 返回string中指向開始部分出現的不在strCharSet指向字串中字元的個數。
  • 測試一下:
int main()
{
	char *p = "bcdef123hujkl";
	char *p1 = "huhuhu1jij";
	printf("%d\n", strcspn(p, p1));
	system("pause");
	return 0;
}
  • 結果: