字符函数和字符串函数(1)

1.求字符串长度  strlen

2.长度不受限制的字符串函数 :strcpy,   strcat,   strcmp

3.长度受限制的字符串函数:strncpy,   strncat,   strncmp

以上函数只对字符串有用

strlen    #include<string.h>

size_t  strlen  (const char* str)(可在 cplusplus 网站具体查询库函数)

1. 字符串要以 '\0' 结尾,返回的是在字符串中 '\0' 前面出现的字符个数。

2.返回的参数为 size_t(相当于 unsigned int),是无符号的

3.模拟实现strlen

举例

#include<stdio.h>
#include<string.h>
int main()
{
	int ret = strlen("abcdef");//a b c d e f \0
	printf("%d\n", ret);// 6
	return 0;
}

模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>//使用assert要引的头文件
int my_strlen(const char* str)//const限制 *str,*str不能改变
{
	assert(str != NULL);//如果str传的是空指针,则会报错,并显示位置
	int count = 0;//用来计数
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
int main()
{
	char* p = "abcdef";//常量字符串不能修改
	int ret = my_strlen(p);
	printf("%d\n", ret);//打印结果是 6 
	return 0;
}

strcpy   #include<string.h>

char* strcpy (char* destination, const char* source)

1.destination是拷贝的目的地,source是被拷贝的字

符串(简称源字符串)。

2.源字符串必须有 '\0' ,并且拷贝时会把源字符串中的 '\0' 拷贝到目的地。

3.目标空间要能存放被拷贝的字符串,并且目标空间可变。

4.返回的是目的地空间的地址

5.模拟实现

举例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdefg";
	char* p = "bite";
	printf("%s\n", strcpy(arr1, p));//bite
	//其中 arr1 内存的是 b i t e \0 f g \0
	return 0;
}

模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* s)
{
	assert(dest && s);//空指针返回 0
	char* ret = dest;//接受目标空间的首地址
	while (*dest++ = *s++)//把 \0 也拷贝到目标空间,采用 = ,而不是 ==
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[] = "abcdefg";
	char* p = "bite";//不会改变,可以采用 常量字符串
	printf("%s\n", my_strcpy(arr1, p));//bite
	return 0;
}

strncpy  #include<string.h>

char* strncpy (char* dest, const char* source, size_t num)

1.与strcpy功能类似,只不过可以自己控制要拷贝内容的多少

2.num 指要拷贝的数量,单位是字节

3.如果源字符串的长度小于 num ,拷贝时依旧要在目标位置处追加 '\0' ,直到num个

举例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = "abcdefxx";
	char* p = "hhh";
	printf("%s\n", strncpy(arr, p, 6));//hhh
	//arr 里放的内容:h h h \0 \0 \0 x x \0
	return 0;
}

strcat   #include<string.h>

char* strcat (char* destination,const const* source)

1.源字符串必须以 '\0' 结束,目标空间也要有 '\0'(可以有多个)

2.目标空间必须足够大,能容下接受源字符串后的内容

3.目标空间必须可修改

4.找到目标空间第一个 '\0' ,拷贝从 '\0' 处开始拷贝

5.拷贝时连源字符串的 '\0' 也要拷贝,返回目标空间首地址

6.模拟实现

7.自己追加自己,会一直追加下去

举例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[30] = "ab\0cdefgh";//arr[30],目标空间要足够大
	char* p = "bite";
	printf("%s\n", strcat(arr, p));//abbite
	//arr 里存的内容:a b b i t e \0 g h \0 \0 ……
	return 0;
}

模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);//判断不是空指针
	char* ret = dest;//返回时需要目标空间的地址
	//1.先找到目标空间的第一个'\0'
	while (*dest != '\0')
	{
		dest++;
	}
	//2.追加字符串
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr[30] = "ab\0cdefgh";
	char* p = "bite";
	printf("%s\n", my_strcat(arr, p));//abbite
	return 0;
}

strncat   #include<string.h>

char* strncat (char* dest, const char* source, size_t num)

1.num 指要追加的数量,单位字节

2.无论追加什么,最后都是 '\0' 结尾

3.如果num 数大于源字符串的字符数,其效果等同于 strcat

举例

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[30] = "hello\0xxxxxxx";
	char* p1 = "world";
	printf("%s\n", strncat(arr1, p1, 3));//hellowor
	//arr1:h e l l o w o r \0 x x x x \0 \0……
	char arr2[30] = "hello\0xxxxxxx";
	char* p2 = "bite";
	printf("%s\n", strncat(arr2, p2, 8));//hellobite
	//arr2:h e l l o b i t e \0 x x x
	return 0;
}

strcmp   #include<string.h>

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

标准规定:

1.从前往后一个一个字符比较

2.如果有不同,则找到的第一个不同的字符比较()

   如果第一个大于第二个,返回大于 0 的数;否则,返回小于 0 的数(不同编译器返回的数字不       同)

("abca"与"abc"比较,a的码值是97,大于 0 的码值0,所以返回大于 0)

3.如果两个字符串相同则返回 0

4.比较的是第一个 '\0' 前的内容

5.模拟实现

举例

#include<stdio.h>
#include<string.h>
int main()
{
	char* p1 = "abcdef";
	char* p2 = "abcd";
	char* p3 = "abcd";
	printf("%d\n", strcmp(p1, p2));//1
	printf("%d\n", strcmp(p2, p3));//0
	return 0;
}

模拟实现

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* p1, const char* p2)
{
	assert(p1 && p2);
	while (*p1 == *p2)
	{
		if (*p1 == '\0')
		{
			return 0;
		}
		p1++;
		p2++;
	}
	return *p1 - *p2;
}
int main()
{
	char* p1 = "abcdef";
	char* p2 = "abcd";
	char* p3 = "abcd";
	printf("%d\n", my_strcmp(p1, p2));//101
	printf("%d\n", my_strcmp(p3, p2));//0
	printf("%d\n", 'e');//101
	return 0;
}

strncmp   #include<string.h>

int strncmp (const char* str1, const char* str2, size_t num)

1.num 指要比较的数量,单位字节

2.其他功能和strcmp相同

3.尽管有num  的存在,但还是比较第一个 '\0' 前的内容

举例

#include<stdio.h>
#include<string.h>
int main()
{
	char* p3 = "ab";
	char* p1 = "abc";
	char* p2 = "abc\0abc";
	printf("%d\n", strcmp(p1, p2));//0
	printf("%d\n", strncmp(p1, p2, 5));//0
	printf("%d\n", strncmp(p1, p3, 2));//0
	return 0;
}

最后拜托读者点赞,关注,收藏!!!!!!!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值