C语言|字符串函数(附模拟实现)

一、strlen 

1.包含头文件:<string.h>

2.功能介绍:   

        返回字符串长度(到空字符结束“\0”)。

3.在C语言标准库中的声明定义:

size_t strlen ( const char * str );

4.模拟实现: 

         方法一;计数器版本

//计数器版:
size_t my_strlen(const int* p) {
	
	assert(p);
	int count = 0;
	
	while (*p != '\0') {
		count++;
		p++;
	}
	
	return count;
}

        方法二:递归(不创建临时变量)

size_t my_strlen(const char* p) {

	assert(p);
	if (*p == '\0') {
		return 0;
	}
	else {
		return 1 + my_strlen(p + 1);
	}
}

 5.需要注意:

        (1)字符串以 ' \0 ' 作为结束标志,strlen函数返回的是在字符串中 ' \0 ’ 前面出现的字符个数(不包含 '\0 ')。

        (2)参数指向的字符串必须要以'\0'结束。

        (3)注意函数的返回值为 size_t,是无符号的

二、strcpy

1.包含头文件<string.h>

2.功能介绍:

         把 src所指向的字符串复制到 dest。(字符串拷贝)

3.在C语言标准库中的声明定义:

char *strcpy(char *dest, const char *src)

4.模拟实现:

char* my_strcpy(char* dest,const char* src ) {
	assert(dest && src);
	char* ret = dest;
	//拷贝\0之前的内容
	while (*src != '\0') {
		*dest = *src;
		dest++;
		src++;
	}
	//while(*dest++ = *src++){
	// 
	// }
	// '\0'的ASCALL的值为0
	// 
	//while循环中的代码可写为:
	//*dest++ = *src++;
	*dest = *src;//拷贝\0

	return ret;
}

5.需要注意:

        (1)源字符串必须以'\0'结束。

        (2)会将源字符串中的'\0'拷贝到目标空间。

        即需要将资源数组src中的 ‘ \0 ’ 也拷贝过去

        (3)目标空间必须足够大,以确保能存放源字符串。

        (4)目标空间必须可修改。

        以下代码此时p是常量字符串,不可拷贝。

char* p = "xxxxxxxxxxxxxxxx"

三、strcat

1.包含头文件<string.h>

2.功能介绍: 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾

3.在C语言标准库中的声明定义:

char *strcat(char *dest, const char *src)

4.模拟实现:

char* my_strcat(char* dest,char* src) {
    assert(dest && src);

	char* ret = dest;

	//找到目标的‘\0’
	while (*dest != '\0') {
		dest++;
	}
	//拷贝\0
	while (*dest++ = *src++) 
		;
	return ret;
}

int main() {
	
	char arr1[20] = "hello ";
	char arr2[] = "world";
	my_strcat(arr1,arr2);

	printf("%s\n", arr1);
	return 0;
	}

5.需要注意:

        (1)源字符串必须以 ‘\0’ 结束

        (2)目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始

        (3)目标空间必须有足够的大,能容下源字符串的内容

        (4)目标空间必须可修改

四、strcmp

1.包含头文件<string.h>

2.功能介绍:把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

3.在C语言标准库中的声明定义:

int strcmp(const char *str1, const char *str2)

4.模拟实现

int my_strcmp(const char* arr1, const char* arr2) {
	assert(arr1 && arr2);
	int ret = 0;

	while (*arr1 == *arr2) {
		if (*arr1 == '\0')
			return 0; 
		arr1++;
		arr2++;
	}
	if (*arr1 > *arr2) {
		return 1;
	}
	else {
		return -1;
	}

	return ret;
}

int main() {

	char arr1[] = "abcde";
	char arr2[] = "abcdf";
	
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

5.需要注意:

        (1)第一个字符串大于第二个字符串,则返回大于0的数字0

        (2)第一个字符串等于第二个字符串,则返回0

        (3)第一个字符串小于第二个字符串,则返回小于0的数字

        (4)那么如何判断两个字符串?比较两个字符串中对应位置上字符ASCII码值的大小。

五、strstr

1.包含头文件<string.h>

2.功能介绍:在字符串arr1中查找第一次出现字符串 arr2 的位置,不包含终止符 '\0'。

3.在C语言标准库中的声明定义:

char *strstr(const char *arr1, const char *arr2)

4.模拟实现:

char* my_strstr(const char* src1, const char* src2) {
	
	//特殊场景:如果查找空字符
	if (*src2 == '\0') {
	
		return (char*)src1;
	}

	//正常情况下
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = src1;
 
	while (*cur != '\0') {
		s1 = cur;
		s2 = src2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)  //s1和s2都不为 \0 ,且s1等于s2时,防止极端情况,如在abc中查找abc        
        {
			s1++;
			s2++;
		}
		if (*s2 == '\0')   //找完的情况下 
        {
			return cur;//返回当前指针
		}
		cur++;
	}
	return NULL;//没找到
}

int main() {

	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL) {
		printf("%s\n", ret);
	}
	else
		printf("找不到!\n");
	return 0;
}

5.需要注意:

        (1)函数返回字符串str2在字符串str1中第一次出现的位置。

        (2)字符串的比较匹配不包含 \0 字符,以 \0 作为结束标志.

六、其他

        以上四种在C语言中属于无限制字符串函数,与之对应的还有长度受限制的字符串函数(strstr除外),即strnlen,strncpy,strncat等等,其参数多了一项无符号整型(size_t  num),用来表示操作的字符个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值