0
点赞
收藏
分享

微信扫一扫

字符和字符串的库函数

Just_Esme 2022-04-19 阅读 77
c#

声明:由于本人水平有限,文章中难免有不准确和错误之处本人也很想知道这些错误,恳请读者批评指正,大家一起努力,加油!




目录

1.strlen

模拟实现

方式一:计数器的方法

方式二:指针—指针的方法

方式三:递归的方法

 2.strcpy

模拟实现

3.strcat

模拟实现

 4.strcmp

模拟实现

5.strncpy

模拟实现

6.strncat

模拟实现

7.strncmp

模拟实现

8.strstr

模拟实现

方式一:常规方式

方式二:strncmp进行比较

方式三:for循环遍历

9.strtok

 例子:


本章本章主要介绍字符和字符串相关库函数,与模拟实现。

1.strlen

作用介绍:求字符串长度(不包含‘\0’)

函数的使用:

int main()
{
	char arr[] = "abcd";
	int len = strlen(arr);
	printf("%d\n", len);//结果为4
	return 0;
}

模拟实现

方式一:计数器的方法

int my_strlen(char* str)
{
	int count = 0;//计数器
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcd";
	int len =my_strlen(arr);
	printf("%d\n", len);//结果为4
	return 0;
}

方式二:指针—指针的方法

int my_strlen(char* str)
{
	char* strart = str;  //记住str的初始位置
	while (*str)
	{
		str++;
	}
	return str - strart;  //指针-指针返回中间元素的个数
}
int main()
{
	char arr[] = "abcd";
	int len =my_strlen(arr);
	printf("%d\n", len);//结果为4
	return 0;
}

方式三:递归的方法

int my_strlen(char* str)
{
	if (*str)
		return 1 + my_strlen(str + 1);
	else
		return 0;
}
int main()
{
	char arr[] = "abcd";
	int len =my_strlen(arr);
	printf("%d\n", len);//结果为4
	return 0;
}

前面计数器和指针减去指针的方式很容易理解,我们好好分析一下递归的实现,思想就是判断是否为‘\0‘,如果不是那就1+字符串+1,如下图所示:

 2.strcpy

作用介绍:字符串拷贝(包括’ \0’)

 函数的使用:

int main()
{
	char arr1[10] = "*********";
	char arr2[] = "abcd";
	strcpy(arr1, arr2);//将字符串2中的内容拷贝到字符串1中
	printf("%s\n", arr1);
	return 0;
}

模拟实现

void my_strcpy(char* s1, char* s2)
{
	while (*s2)
	{
		*s1 = *s2;
		s1++;
		s2++;
	}
	*s1 = '\0';  //对\0的拷贝,字符串结束的标志必不可少
}
int main()
{
	char arr1[10] = "*********";
	char arr2[] = "abcd";
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

3.strcat

作用:将source所指向的字符串追加到destination后

 函数的使用

int main()
{
	char arr1[10] = "abcd";
	char arr2[] = "efgh";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

模拟实现

void my_strcat(char* str1, char* str2)
{
	while (*str1)//找到目标字符串的\0
	{
		str1++;    
	}
	while (*str2++=*str2++)//追加源字符串
	{
		;
	}
}
int main()
{
	char arr1[10] = "abcd";
	char arr2[] = "efgh";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

注意:strcat不能自己拷贝自己!这样会把'\0'覆盖,永远不会停下来了。

 4.strcmp

作用介绍:比较两个字符串大小,相等则返回0

    >0第一个字符串大于第二个字符串
    =0第一个字符串等于第二个字符串
    <0第一个字符串小于第二个字串串

比较str1和str2对应字符的ascii码值!

函数的使用

int main()
{
	char arr1[] = "abcde";
	char arr2[] = "abcde";
	if (strcmp(arr1, arr2) == 0)
	{
		printf("相等");
	}
	return 0;
}

模拟实现

int my_strcmp(char* s1, char* s2)
{
	while (*s1 == *s2)//判断s1和s2是否相等
	{
		if (*s1 == '\0' )
			return 0;
		s1++;
		s2++;
	}
    return *s1-*s2;
}
int main()
{
	char arr1[] = "abc";
	char arr2[] = "abc";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf(">");
	}
	else if (ret < 0)
	{
		printf("<");
	}
	else
	{
		printf("=");
	}
	return 0;
}

5.strncpy

作用介绍:将source中的num个字符拷贝到 destination中

 函数的使用

int main()
{
	char arr1[10] = "abcd";
	char arr2[] = "efgh";
	strncpy(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

模拟实现

char* my_strncpy(char* dest, const char* src, int num)
{
	assert(dest && src);
	char* cp = dest;
	while (num && (*cp++ = *src++))//将src字符串中的num个字符拷贝到cp中
	{
		num--;
	}
	while (num)//若num人大于0,则将cp中接下来的num个字符置为'\0'
	{
		*cp++ = '\0';
		num--;
	}
	return dest;
}
int main()
{
	char arr1[10] = "abcd";
	char arr2[] = "efgh";
	my_strncpy(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

6.strncat

作用介绍:将source中的num个字符追加到destination中

 函数的使用

int main()
{
	char arr1[10] = "abcd";
	char arr2[] = "bcde";
	strncat(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

模拟实现

char* my_strncat(char* s1, char* s2, int count)
{
	assert(s1 && s2);
	char* start = s1;
	while (*s1)
	{
		s1++;
	}
	while (count--)   //拷贝count个字符
	{
		if ((*s1++ = *s2++) == 0)//如果提前结束了,就不用再拷贝后面的\0了
			return start;
	}
	*s1 = '\0';
	return start;
}
int main()
{
	char arr1[10] = "abcd";
	char arr2[] = "bcde";
	my_strncat(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

7.strncmp

作用介绍:比较说说str1和str2中num个字符

 函数的使用

int main()
{
	char arr1[] = "abc";
	char arr2[] = "abcdefg";
	if (strncmp(arr1, arr2, 3) == 0)
	{
		printf("=");
	}
	else
	{
		printf("!=");
	}
 	return 0;
}

模拟实现

int my_strncmp(char* str1, char* str2, int count)
{
	while (*str1 == *str2 && count--)
	{
		if (str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[] = "abc";
	char arr2[] = "abcdefg";
	if (my_strncmp(arr1, arr2, 3) == 0)
	{
		printf("=");
	}
	else
	{
		printf("!=");
	}
 	return 0;
}

8.strstr

作用介绍:在str1字符串中找str2字符串,找到了返回出现位置的首地址,找不到返回NULL

 函数使用

int main()
{
	char arr1[] = "abbbc";
	char arr2[] = "bbc";
	char* p = strstr(arr1, arr2);
	printf("%p\n", p);
	return 0;
}

模拟实现

方式一:常规方式

 

char* my_strstr(char* str1, char* str2)
{
	assert(str1, str2);
	char* s1 = NULL;
	char* s2 = NULL;
	char* cp = str1;
	while (*cp)//cp遍历str1
	{
		s1 = cp;
		s2 = str2;//每次都从str2第一个元素开始比较
		while (*s1 && *s2 && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')//str2遍历
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "abbbc";
	char arr2[] = "bbc";
	char* p = my_strstr(arr1, arr2);
	if (p != NULL)
	{
		printf("找到了 %s\n", p);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

方式二:strncmp进行比较

char* my_strstr(char* str1, char* str2)
{
	assert(str1, str2);
	int i = 0;
	int len = strlen(str2);
	for (i = 0; *(str1 + i); i++)//遍历str1
	{
		if (strncmp(*(str1 + i), *str2, len) == 0)
		{
			return (str1 + i);
		}
	}
	return NULL;
}
int main()
{
	char arr1[] = "abbbc";
	char arr2[] = "bbc";
	char* p = my_strstr(arr1, arr2);
	if (p != NULL)
	{
		printf("找到了 %s\n", p);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

方式三:for循环遍历

char* my_strstr(char* str1, char* str2)
{
	int i = 0;
	for (i = 0; *(str1 + i); i++)//遍历str1
	{
		int j = 0;
		for (j = 0; *(str2 + j); j++)//遍历str2
		{
			if (*(str1 + i + j) != *(str2 + j))
			{
				break;
			}
		}
		if (*(str2+j) == '\0')
		{
			return str1 + i;
		}
	}
	return NULL;
}
int main()
{
	char arr1[] = "abbbc";
	char arr2[] = "bbc";
	char* p = my_strstr(arr1, arr2);
	if (p != NULL)
	{
		printf("找到了 %s\n", p);
	}
	else
	{
		printf("找不到\n");
	}
	return 0;
}

9.strtok

作用介绍:分割字符串

 

 例子:

int main()
{
	char arr[] = "ydj@2948282264.qq";
	char* p = "@ .";
	char* ret = NULL;
	for (ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p))
	{
		printf("%s\n",ret);
	}
	return 0;
}

 strtok每次分割后,把分割符的位置 置为' \0 ',并保留此位置。


字符串相关的库函数就介绍到这里了,感谢您的阅读。

举报

相关推荐

0 条评论