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;
}

  • 结果:

猜你喜欢

转载自blog.csdn.net/abc_xixi111/article/details/80171558