【C语言进阶】字符串和内存函数(一)

1、长度不受限制的字符串函数

1.1、strlen函数

size_t strlen(const char* str);

1、sizeof — 操作符 — 计算大小的,sizeof返回的类型是size_t,而size_t本质上是unsigned int类型

//模拟实现strlen
#include <stdio.h>
#include <string.h>
#include <assert.h>
int my_strlen(const char* str)
{
	assert(str);//断言str不是空指针
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	int len = my_strlen("abcdef");
	printf("%d\n", len);
	return 0;
}

2、字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’前面出现的字符个数,不包含’\0’

3、参数指向的字符串必须以 ‘\0’ 结束

1.2、strcpy函数

1、源字符串必须以 ‘\0’ 结束(源字符串即被拷贝的字符串)

2、strcpy函数会将源字符串中的 ‘\0’ 拷贝到目标空间

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

4、目标空间必须可变(举反例)

//错例,代码不能这样写!!!
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdef";
	const char* p = "xxxxxxxx";
	//此时指针变量p被const修饰,p指向的内容不能改变,所以是错的
	strcpy(p, arr1);
	printf("%s\n", p);
	return 0;
}

5、模拟实现strcpy函数

#include <assert.h>
#include <stdio.h>
//模拟实现strcpy函数
char* my_strcpy(char* dest,const char* src)
{
	char* ret = dest;
	assert(dest && src);//断言两个都不为空指针
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

int main()
{
	char arr1[] = { 'a','b','c','d','e','f','\0' };
	char arr2[20] = "xxxxxxxxxx";
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

1.3、strcat函数

1、将字符串中的内容追加到 目的字符串 后面
2、目标空间必须足够大,能容纳下源字符串的内容
3、追加的字符串后必须要有’\0’
4、目标字符串后必须要有’\0’
5、目标空间必须可修改
6、模拟实现strcat函数
在这里插入图片描述

1.4、strcmp函数

1、字符串比较(比较的是对应位置上的字符大小)
2、比较的是对应字符位置的ASCII码值
3、模拟实现strcmp函数
在这里插入图片描述

2、长度受限制的字符串函数

2.1、strncpy函数

使用例子

#include <stdio.h>
int main()
{
	char arr1[] = "xxxxxxxxxxxxxxxx";
	char arr2[] = "hello world";

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

2.2、strncat函数

用例

int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	strncat(arr1, arr2, 5);
	printf("%s\n", arr1);
	return 0;
}

2.3、strncmp函数

用例

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abcqqqqq";
	int ret = strncmp(arr1, arr2, 4);
	printf("%d\n", ret);
	return 0;
}

3、strstr函数

1、作用是在字符串中查找目标字符串,下面是用例

#include <assert.h>
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abcdefabcdef";
	char arr2[] = "bcd";

	char* ret = strstr(arr1, arr2);
	if (NULL == ret)
	{
		printf("没找到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

2、模拟实现strstr函数
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

小知识

1、指针不知道赋什么值的时候,就给NULL
2、指针使用完后,赋值NULL
3、链式访问(举例)
4、两个字符串不能直接用等号比较,也不能相减,因为使用两个字符串时,产生的是两个字符串的首地址

int main()
{
   int len = strlen("abcdef");
   printf("%d\n",strlen("abcdef"));
   return 0;
}

错例

//错误代码,请勿模仿
int* test()
{
   int a = 10;
   return &a;
}

int main()
{
   int* p = test();
   *p = 20;//形成非法访问
   //因为函数中的临时变量申请的空间
   //在出函数的时候就被销毁了
   //所以会形成非法访问
   return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值