C/C++字符串函数

不受限制

字符串的长度

strlen(const char* s)
在s中遇到’\0’为止,返回字符串长度

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{
	char str[10] = "Hello";
	int len = strlen(str);
	printf("%d\n", len);//求出长度为5,不会算'\0'
	//sizeof()就会加上'\0'
	int sz = sizeof(str);
	printf("%d\n", sz);//求出数组总大小包括'\0'
	return 0;
}

字符串的拷贝

字符串拷贝(全部拷贝过来,不受限制)

strcpy(char* des , const char* src)
把src中的内容拷贝至des,如果des中有数据,就会被全部覆盖

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
	char s[10] = "hello";
	char* s2 = "world";
	printf("原数据:%s\n", s);
	strcpy(s, s2);
	printf("拷贝后的数据:s = %s\n", s);
	return 0;
}

注意:目标字符串的长度空间要大于原字符串长度空间。

字符串的追加

字符串追加(全部追加过来,不受限制) strcat(char* des,const char* src)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

int main()
{
	char str[15] = "hello";
	char* sr = "world";
	strcat(str, sr);
	printf("追加后:%s\n", str);
	return 0;
}

在这里插入图片描述
注意:目标字符串长度空间要大于原字符串长度空间
sizeof(str)>sizeof(sr)

字符串的比较

字符串比较 (原字符串全部比较,不受限制)
strcmp(char* des,const char* src)

=0 相等
0 字符串des大于字符串src
<0 字符串des小于字符串src

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
//比较结果三种不同的值
	char s1[10] = "Hello";
	char s2[10] = "Worldhhh";
	char s3[10] = "A";
	char s4[10] = "Hello";
	int l1 = strcmp(s1, s2);//小于
	printf("l1 = %d\n", l1);
	int l2 = strcmp(s1, s3);//大于
	printf("l2 = %d\n", l2);
	int l3 = strcmp(s1, s4);//相等
	printf("l3 = %d\n", l3);
	return 0;
}

在这里插入图片描述

字符查找

strchr(char* des,int c)
在字符串des中查找字符src找到了就返回第一次出现
src的地址,没找到返回NULL指针

int main()
{
	char s[10] = "helda";
	char s2 = 'e';
	printf("e 首地址:%d\n", &s[1]);
	char* sz = strchr(s, s2);
	printf("sz 返回首地址 = %d", sz);
}

在s中找到了字符e,返回e的地址
运行结果:
在这里插入图片描述

受限制

字符串拷贝(受限制,指定长度拷贝)

strncpy(char* des, const char* src,unsigned int size)
des是要拷贝到哪个字符串中
src是要拷贝的源字符串首地址,size是指要拷贝的字符的个数

int main(){
	char s[10] = "hello";
	char s2[10] = { 0 };
	strncpy(s2, s, 4);
	printf("s2 = %s", s2);
}

我只截取了前面4位所以显示hell
在这里插入图片描述

字符串追加(受限制,指定长度追加)

strncat(char* des, const char* src,unsigned int size)
des是要追加到哪个字符串后面
src是要追加的源字符串首地址,size是指要追加的字符的个数

int mian()
{
	char s[10] = "hello";
	char s2[10] = "wo";
	strncat(s, s2, 1);
	printf("s = %s", s);
}

我只追加了一个字符,所以hello只追加一个字符
运行结果:
在这里插入图片描述

字符串比较(受限制,指定长度比较)

strncmp(char* des, const char* src,unsigned int size)
des是要比较的目的字符串
src要比较的源字符串是首地址,size是指要比较的字符的个数

int main()
{
	char s[10] = "hello";
	char s2[10] = "helda";
	int ret = strncmp(s, s2, 3);
	printf("ret = %d", ret);
}

我只比较了前面3个字符,所以返回0是相等的
运行结果:
在这里插入图片描述

字符串查找(受限制,指定长度查找)

strstr(char* des,const char* src)
在字符串des中查找src,找到了,就返回第一次出现的src的首地址,没找到返回NULL指针

int main()
{
	char s[10] = "helda";
	char s2[10] = "helzs";
	printf("s2 首地址:%d\n", s2);
	char* sz = strstr(s, s2);
	printf("sz 返回首地址 = %d",sz );
}

未找到返回空指针
运行结果:
在这里插入图片描述

字符串分段

strtok(char* des,const char* src)
字符串des中找到src就返回src之前的字符串
在之后strtok(NULL,src)继续查找src找到了就返回上一次找到的src之后到这一次找到的src之前的字符串直至找不到就会返回空指针。

int main()
{
	char s[10] = "hel";
	char s2[10] = "helsada";
	char * res = strtok(s2, s);
	printf("res = %#x\n", res);
	char* ret = strtok(NULL, s);
	printf("ret = %d", ret);
}

在s2中截取了s那一段,s2找到s之前的字符串首地址
运行结果
在这里插入图片描述

内存操作函数

内存拷贝

void *memcpy(void dest, const void src, size_t n)
我们可以看见,str1,str2都是void
的返回类型也是void
所以它可以拷贝包括自定义类型的内存
n表示拷贝的长度

int main(){
	char s[10] = "hello";
	char s2[10];
	memcpy(s2, s, 3);
	printf("s2 = %s", s2);
}

我只拷贝了3个字符所以s2只有hel
运行结果:
在这里插入图片描述

内存移动覆盖

void * memmove ( void * destination, const void * source, size_t num )
从source中移动num长度的字符到destination,从destination首地址开始覆盖
返回移动好的首地址

int main(){
	char s[10] = "hello";
	char s2[10] = "why";
	memmove(s, s2, 2);
	printf("s = %s", s);
}

我把s2中的前2个字符移到了s中,并且覆盖了s中的前两个字符。
运行结果:
在这里插入图片描述

内存设置(常用于初始化)

void * memset(void* str,int c,size_t n)
将str的前n个字符的内容全部设置为c-----我们常用于初始化
返回设置好的首地址

int main(){
	char s[10] = "hello";
	char s2[10];
	memset(s2, 'a', sizeof(char) * 10);
	for (int i = 0; i < sizeof(char)*10; i++)
	{
		printf("s2 = %c\n", *(s2 + i));
	}
}

我把字符串s2全部初始化为’a’
运行结果:
在这里插入图片描述

内存比较

void* memcmp(const void* ptr1,const char* ptr2,size_t num)
把ptr2的前num个字节与ptr1进行比较
ptr1 > ptr2返回大于零的值
ptr1 = ptr2返回零
ptr1 < ptr2返回小于零的值

int main(){
	char s[10] = "hello";
	char s2[10] = "hels";
	int ret1 = memcmp(s, s2, 3);
	int ret2 = memcmp(s, s2, 4);
	printf("ret1 = %d\n", ret1);
	printf("ret2 = %d", ret2);
}

第一次我比较前三个字符,相等返回0
第二次我比较前四个字符,s比s2小返回-1
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值