字符串函数介绍

1.Strlen

作用:返回字符串中“\0”前面出现的字符个数,不包括“\0”。

想了解一个函数的用法,最简单的方式就是进入cplusplus的网站搜索,这里我把网站放在下面,方便大家查看。

strlen - C++ Reference (cplusplus.com)

 使用方法:

#include<stdio.h>
int main()
{
	char arr[] = "abcdefg";
	printf("%d", strlen(arr));
    //只需要把要求的数组名放进strlen后面的括号里面就行
	return 0;
}

运行效果:

 模拟实现Strlen:

为了更深刻的理解strlen,接下来我们来模拟实现它。

方法一:计数器方式

#include<stdio.h>

size_t my_strlen(const char* str)
//3.函数的参数和Strlen一样
{
	int count = 0;
	//4.定义一个计数器
	while (*str != '\0')
	//5.如果str指向的位置不是\0,就进入循环,这里我们省略掉,因为当str=0时就为假,就会跳出循环
	{
		str++;
		//6.str向后走一步
		count++;
		//7.计数器+1
	}
	return count;
	//跳出循环时,返回计数器
}
int main()
{
	char arr[] = "helloword";
	//1.定义一个数组
	int ret = my_strlen(arr);
	//2.定义一个函数,把它返回的数据用ret接收
	printf("%d", ret);
	return 0;
}

方法二:递归方式

#include<stdio.h>

size_t my_strlen(const char* str)
//3.函数的参数和Strlen一样
{
	if (*str == '\0')
	//4.如果str等于0
		return 0;
		//5.直接返回0
	else
		return 1 + my_strlen(str + 1);
		//6.这里返回的是1加上后面字符串的大小,就是整个字符串的大小
}
int main()
{
	char arr[] = "helloword";
	//1.定义一个数组
	int ret = my_strlen(arr);
	//2.定义一个函数,把它返回的数据用ret接收
	printf("%d", ret);
	return 0;

3.指针减指针的方法

#include<stdio.h>

size_t my_strlen(const char* str)
//3.函数的参数和Strlen一样
{
	int s = str;
	//4.定义一个变量存放数组首元素的位置
	while (*str)
	//5.如果不等于0,就进入循环
	{
		str++;
		//6.str向后走一步
	}
	return str - s;
	//7.指针—指针,得到的是两个指针之间元素的个数

}
int main()
{
	char arr[] = "helloword";
	//1.定义一个数组
	int ret = my_strlen(arr);
	//2.定义一个函数,把它返回的数据用ret接收
	printf("%d", ret);
	return 0;
}

注意事项:

  1. 参数指向的字符串必须要以 '\0' 结束。
  2. 注意函数的返回值为size_t,是无符号的( 易错 )
  3. 学会strlen函数的模拟实现

2.Strcmp

作用:比较两个字符串里面对应元素的大小

strcmp - C++ Reference (cplusplus.com)

使用方法:

#include<stdio.h>
#include<string.h>

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcc";
	int ret = strcmp(arr1, arr2);
	printf("%d", ret);
	return 0;
}

strcmp函数比较方式是一对一对的,先同时比较两个字符串下标为0的数据,如果他们是相等的,则再同时比较下标为1的数据,以此类推,直到遇到“\0”,比较的方式是ASCII码值。

如果arr1>arr2,则返回一个大于0的数字

       arr1=arr2,则返回0

       arr1<arr2,则返回一个小于0的数字

在vs的环境中,大于返回1,等于返回0,小于返回-1。

运行效果:

 模拟实现Strcmp:

#include<stdio.h>
#include<assert.h>
//assert的头文件

int my_strcmp(const char* str1, const char* str2)
//3.函数的参数strcmp一样
{
	assert(str1 && str2);
	//4.断言一下,确保不是为空
	while (*str1 == *str2)
	//5.拿出str1的首元素和str2的首元素对比一下,是相等的话进入循环
	{
		if (str1 == '\0')
		//6.如果str1等于\0,就返回0,因为str1等于\0,str2也等于\0
			return 0;
		str1++;
		//7.str1向后走一位
		str2++;
		//8.str2向后走一位
	}
	if (*str1 > *str2)
		return 1;
	//9.如果大于,返回1
	else
		return -1;
	//10.如果小于,返回-1

}

int main()
{
	char arr1[] = "abcd";
	char arr2[] = "abcc";
	//1.定义两个字符串
	int ret = my_strcmp(arr1, arr2);
	//2.定义函数,函数的返回值放到ret里面
	printf("%d", ret);
	return 0;
}

3.Strcpy

作用:拷贝字符串到另外一个字符串

 strcpy - C++ Reference (cplusplus.com)

使用方法和运行效果:

 如图所示,strcpy成功的把arr2里的字符串拷贝到了arr1里面,包括\0,实际上原理很简单,就是一直向后走,直到遇到\0就停止。

模拟实现        Strcpy:

#include<stdio.h>
#include<string.h>
char* my_strcpy(char* des, char* son)
//3.函数的参数和strcpy一样
{
	char* ret = des;
	//4.把des的存到ret里面
	while (*des++ = *son++)
	//5.把des的值赋值到son里面,如果des=\0,则两边同时为假,就会跳出循环
	{
		;
	}
	return ret;
	//6.改完之后返回ret
}
int main()
{
	char arr1[20] = "XXXXXXXXXX";
	char arr2[] = "ABCD";
	//1.创建两个数组
	my_strcpy(arr1, arr2);
	//2.创建一个函数,arr1是目的地,arr2是来源
	return 0;
}

注意事项:

  1. 源字符串必须以'\0'结束
  2. 会将源字符串中的 '\0' 拷贝到目标空间
  3. 目标空间必须足够大,以确保能存放源字符串
  4. 目标空间必须可变
  5. 学会模拟实现

4.Strcat

作用:在目标字符串后面追加另一个字符串

 strcat - C++ Reference (cplusplus.com)

使用方法和运行效果:

 如图所示,strcat函数,成功的在字符串arr1后面追加了arr2,他的原理是先找到目的地数组里面的\0,再把arr2拷贝过去,它会把arr1字符串后面的\0替换掉,再把追加成功后的字符串末尾添加一个\0。

模拟实现:

#include<stdio.h>
#include<string.h>
#include<assert.h>
//assert的头文件
char* my_strcat(char* dest, char* sour)
{
	assert(dest && sour);
	//3.断言
	char* ret = dest;
	//4.把dest存到ret里面
	while (*dest != '\0')
	//5.如果dest不等于\0,进入循环
	{
		dest++;
	}
	while (*dest++ = *sour++)
	//6.然后挨个赋值,直到遇到\0
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "word";
	//1.创建两个字符串
	char *str = my_strcat(arr1, arr2);
	//2.创建一个函数
	printf("%s", str);
	return 0;
}

注意事项:

  1. 源字符串必须以 '\0' 结束
  2. 目标空间必须有足够的大,能容纳下源字符串的内容。
  3. 目标空间必须可修改。
  4. 字符串如果给自己追加,会出错,原因就是\0被替换掉了,就找不到\0了

上面的这些函数我们叫它长度不受限字符串函数,因为它在是使用的过程中没有指定要拷贝多少个,追加多少个,它们只会找到\0,然后再向后执行。


5.Strncmp

作用:这里我们看到函数的参数和strcmp几乎差不多,只多了一个num,它的意思是比较多少个字符串

 strncmp - C++ Reference (cplusplus.com)

使用方法和运行效果:

这里我们看到arr1的前两个字符和arr2的前两个字符是相同的,所以返回的是0;


6.Strncpy

作用:这它的意思就是要拷贝几个字符串。

 strncpy - C++ Reference (cplusplus.com)

使用方法和运行效果:

 这里我们看到在arr1后面之追加了两个字符。


7.Strncat

作用:它的意思是要在后面追加几个字符串。

strncat - C++ Reference (cplusplus.com)

使用方法和运行效果:

 这里我们看到arr1字符串后面,之追加了两个字符。

以上三个函数,是长度受限字符串函数,我们可以控制它需要拷贝,追加多少个字符。


8.Strstr

作用:在一个字符串里面查找一个字符串,如果找到了,返回首地址,找不到的话返回空指针。

strstr - C++ Reference (cplusplus.com)

使用方法和运行效果:

 这里我们看到,当arr1里面有arr2时,返回的是b的起始地址,连后面的字符也打印出来了。


9.Strtok

strtok - C++ Reference (cplusplus.com) 

使用方法和注意事项:

  1. sep参数是个字符串,定义了用作分隔符的字符集合
  2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。
  3. strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
  4. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
  5. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
  6. 如果字符串中不存在更多的标记,则返回 NULL 指针。

 


10.Memcpy

作用:内存拷贝

memcpy - C++ Reference (cplusplus.com) 

使用方法和运行效果:

 注意事项:

  1. 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  2. 这个函数在遇到 '\0' 的时候并不会停下来。
  3. 如果source和destination有任何的重叠,复制的结果都是未定义的。

11.Memmove

作用:内存拷贝

使用方法和运行效果:

 

注意事项:

  1. 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
  2. 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

12.Memset

作用:以字节为单位来设置内存中的数据

 memset - C++ Reference (cplusplus.com)

使用方法和运行效果:

 

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值