C语言一些字符串函数

  • Post author:
  • Post category:其他


strlen函数

strlen函数被包含在<string.h>头文件内,是用来计算字符长度的库函数。

size_t strlen(const cahr*p);返回值时size_t是因为长度不会是负数,参数加const是因为我们只是要计算长度,并不去改变地址内的内容。

作用原理是将字符串首元素的地址传给strlen,strlen函数则从此地址开始向后读,直到遇到’\0’停下,并返回读取到的字符的个数。strlen函数返回的结果是不计算’\0’在内的字符个数。

#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "hello world";
	printf("%d\n", strlen(str));
	char str1[] = "hello\0world";
	printf("%d\n", strlen(str1));
	return 0;
}

相信对第一个结果没有问题,但第二个结果为什么是5?是因为在hello和world之间有一个’\0’strlen函数在读到’\0’时就会停下来,返回之前记录到的字符个数。

strlen的模拟实现

#include <stdio.h>
#include<assert.h>
size_t My_strlen(const char*p)
{
	assert(p);
	int count = 0;
	while (*p != '\0')
	{
		p++;
		count++;
	}
	return count;
}
int main()
{
	char str[] = "hello world";
	printf("%d",My_strlen(str));
	return 0;
}

strcpy函数

strcpy函数也在<string.h>头文件内。strcpy函数的作用是将一段字符复制到另一端空间内。

char* strcpy(char* p1,const char* p2);

strcpy函数返回值是字符串被复制的目的空间的地址,第一个参数是目的空间,第二个参数是要复制的字符串空间的地址。复制时空间要足够,否者会复制失败。

#include<stdio.h>
#include <string.h>
int main()
{
	char arr[20];
	char str[] = "hello";
	strcpy(arr, str);
	printf("%s\n", arr);
}

接下来我们来模拟实现strcpy。

#include <stdio.h>
char* My_strcpy(char* p1,const char* p2)
{
	char* tem = p1;
	while (*p1++ = *p2++)
	{
		;
	}
	return tem;
}
int main()
{
	My_strcpy();
	return 0;
}

while (*p1++ = *p2++);我们来分析一下这段代码。先将p2内的值赋给p1,然后判断这个p1的值,如果p1被赋值为’\0′,那么循环就会停止,返回新空间的地址。’\0’的ASCII值为0,所以当字符串读取到’\0’后就会停止。

strcmp函数

strcmp函数的作用是比较字符串是否相同,原理是比较相同位置上的字符的ASCII值。如果字符串相同就会返回0.也位于<string.h>。

int strcmp(const char* p1;const char* p2);

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "hello";
	char arr2[] = "hello";
	char arr3[] = "hell";
	printf("%d\n", strcmp(arr1, arr2));
	printf("%d\n", strcmp(arr1, arr3));
	return 0;
}

模拟strcmp函数。

#include <stdio.h>
int My_strcmp(const char* p1,const char* p2)
{
	while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)
	{
		p1++;
		p2++;
	}
	return *p1 - *p2;
}
int main()
{
	char arr1[] = "hello";
	char arr2[] = "hello";
	char arr3[] = "hell";
	printf("%d", My_strcmp(arr1, arr2));
	printf("%d", My_strcmp(arr1, arr3));
	return 0;
}

strcmp函数相同返回0,其他情况只是要求返回正数和负数就行。

strcat函数

stract函数的作用是将一段字符串拼接在另一段字符串后面。同样位于<string.h>内。拼接同样空间也要足够,否则会失败。

char* strcat(char* p1,const char* p2);

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
}

模拟实现strcat

#include<stdio.h>
char* My_strcat(char* p1,const char* p2)
{
	char* tem = p1;
	while (*p1)
	{
		p1++;
	}
	while (*p1++ = *p2++)
	{
		;
	}
	return tem;
}
int main()
{
	char arr1[20] = "hello ";
	char arr2[] = "world";
	printf("%s\n", My_strcat(arr1, arr2));
	return 0;
}

strstr函数

这函数是用来判断字符串str2是否是str1的子串,返回字串的地址。

char* strstr(const char* p1,const char* p2 );

#include<string.h>
#include<stdio.h>
main()
{
	char* string1 = "needle in haystack";
	char* string2 = "hay";
	printf("%s\n",strstr(string1, string2));
	return 0;
}

看模拟代码

#include <stdio.h>
char* My_strstr(const char* p1,const char* p2)
{
	char* s2 = p2;
	while (*p1)
	{
		char* s1 = p1;
		while (*p1 == *p2 && *p1 != '\0' && *p2 != '\0')
		{
			p1++;
			p2++;
		}
		if (*p2 == '\0')
		{
			return s1;
		}
		p1 = s1;
		p2 = s2;
		p1++;
	}
	return NULL;
}
int main()
{
	char arr[] = "abivgdauk";
	char arr1[] = "hfd";
	char arr2[] = "da";
	printf("%s\n", My_strstr(arr, arr1));
	printf("%s\n", My_strstr(arr, arr2));
	return 0;
}

这个函数就是通过指针先将两个字符的首字符比较,如果不相同,那么母串就向后移一位继续比较。还有一种可能,第一个字符相等,后面又不等,那么我们就要回到母串开始比较之前的位置,所以在第一个字符比较相同后,我们需要记录此时母串的位置,才开始比较。也就是上面代码中的s1.



版权声明:本文为m0_74506452原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。