赶紧来修炼内功~字符串函数详解大全(二)

目录

1.strncpy

重点:

 模拟实现:

 2.strncat

重点:

模拟实现: 

3.strncmp

 重点:

 模拟实现:

写在最后:


1.strncpy

该函数包含三个参数,前两个参数与上一篇文章中讲解的strcpy函数一样,一个目的地,一个源,第三个为要拷贝的字节数 (注意这里是字节数!)

重点:

1. 拷贝num个字符从源字符串到目标空间。

2. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。 

 1.

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[15] = "abcdefghij";
	char arr2[] = "1234";
	strncpy(arr1, arr2, 4);
	printf("%s\n", arr1);
	return 0;
}

 

从arr2中拷贝4个字节的内容到arr1,只会覆盖掉前4个字节的内容,不会全部覆盖。

2. 

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[15] = "abcdefghij";
	char arr2[] = "1234";
	strncpy(arr1, arr2, 6);
	printf("%s\n", arr1);
	return 0;
}

 这里我们要从arr2中拷贝6个字节的内容到arr1,但是arr2中只有4个字节的内容,所以拷贝完arr2的内容后要在后面追加两个0;

'\0'的ASCII码值就是0,所以打印arr1时,会提前终止打印。

 模拟实现:

创建一个my_strncpy函数,模拟实现strncpy函数的功能:

其实与模拟实现strcpy函数类似,只不过多了一个控制拷贝多少个字节的参数而已~

#include <stdio.h>
#include <assert.h>
char* my_strncpy(char* dest, const char* src, size_t num)//返回值类型参数类型与原函数保持一致
{//dest所指向的字符串需要被修改,不用const保护,src所指向的字符串不需要被修改用const修饰保护
	assert(dest && src);//断言一下,保证两个指针均不为空指针,若为空指针则中止程序并报错
	char* ret = dest;//创建一个char*变量保存起始地址,后面需要返回起始地址
	while (num--)  //控制拷贝几个字节
	{
		*dest = *src;  //拷贝
		if (*src != '\0') //若src所指向的字符串没有到'\0'就继续++
			src++;        //++,指向下一个字符
		dest++;           //++,指向下一个字符
	}
	return ret; //返回字符串起始位置
}
int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "1234";
	printf("%s\n", my_strncpy(arr1, arr2, 6));
	return 0;
}

 2.strncat

该函数包含三个参数,前两个参数与上一篇文章中讲解的strcat函数一样,一个目的地,一个源,第三个为要追加的字节数 (注意这里是字节数!)

重点:

1. 在目标字符串后面追加num个字节

2. 追加是从目标字符串最后的'\0'开始追加的,同时追加完成后会自动在最后补上一个'\0'

3. 如果源字符串的长度小于num,则就只追加完源字符串,再补上一个'\0'就结束了

4. 可以用该函数自己给自己追加

 1.

int main()
{
	char arr1[15] = "abcdef";
	char arr2[] = "abcd";
	strncat(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

在arr1后面追加两个字节的arr2的内容。

2.

 

 由上面两个步骤的对比,可以很清晰地看出追加是从目标字符串最后的'\0'开始追加的。 

int main()
{
	char arr1[15] = "abcdef\0xxxx";
	char arr2[] = "abcd";
	strncat(arr1, arr2, 2);
	printf("%s\n", arr1);
	return 0;
}

 在arr1字符串中间加上一个'\0'那么就会从这个'\0'处开始追加,我们可以看到追加完"ab"后,又追加了一个'\0'。

 3.

int main()
{
	char arr1[15] = "abcdef\0xxxxxx";
	char arr2[] = "abcd";
	strncat(arr1, arr2, 6);
	printf("%s\n", arr1);
	return 0;
}

  如果源字符串的长度小于num,则就只追加完源字符串,再补上一个'\0'就结束了

4.

int main()
{
	char arr[10] = "abc";
	strncat(arr, arr, 3);
	return 0;
}

 用该函数自己给自己追加是安全的

模拟实现: 

创建一个my_strncat函数,模拟实现strcat函数的功能:

char* my_strncat(char* dest, const char* src, size_t num)
{
	assert(dest && src);
	char* ret = dest;     //上面的代码与前一个模拟实现的函数原因相同,这里就不多赘述了
	while (*dest != '\0') //找到dest指针指向的字符串的末尾的'\0'
		dest++;
	while (num--)         //控制追加几个字节
	{
		*dest = *src;     //追加
		if (*src == '\0') //若src指向'\0',就直接返回终止函数,此时'\0'已经追加完成了
			return ret;
		dest++;           //++,指向下一个字符
		src++;            //++,指向下一个字符
	}
	*dest = '\0';         //追加完成后再在最后追加一个'\0'
	return ret;           //返回字符串的起始地址
}
int main()
{
	char arr1[15] = "abcdef\0xxxxxx";
	char arr2[] = "1234";
	printf("%s\n", my_strncat(arr1, arr2, 3));
	return 0;
}

3.strncmp

 该函数包含三个参数,前两个参数与上一篇文章中讲解的strcmp函数一样,一个目的地,一个源,第三个为要比较的字节数 (注意这里是字节数!)

返回值为int类型,与strcmp函数一样,

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

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

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

 重点:

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

 1. 当两个字符串前num个字符相等时

 2. 当前一个字符串大于后者时

 3. 当前一个字符串小于后者时

 模拟实现:

创建一个my_strncmp函数,模拟实现strncmp函数的功能:

int my_strncmp(const char* str1, const char* str2, size_t num)
{
	assert(str1 && str2);   //上面的代码与前一个模拟实现的函数原因相同,这里就不多赘述了
	while (num--)           //控制比较的字节数
	{
		if (*str1 == *str2)  //比较字符
		{
			if (*str1 == '\0')//判断是否已经比较到了末尾,若为'\0'则表示两字符串相等
				return 0;
			str1++;
			str2++;
		}
		else
			return *str1 - *str2;//若两字符不同就直接返回两字符差值
	}
	return 0;  //若能走到这就说明两字符串所比较的这几个字节的字符时相同的
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abccdg";
	printf("%d\n", my_strncmp(arr1, arr2, 4));
	return 0;
}

写在最后:

本节内容已经讲完,下篇会继续讲解字符串相关函数,期待围观学习!!!

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒲公英的吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值