字符串函数的使用和模拟实现(四)

举报
执久呀 发表于 2022/02/18 12:23:53 2022/02/18
【摘要】 ​ 目录一、前言二、strncpy strncat  strncmp函数介绍 1.strncpy函数strncpy函数模拟实现2.strncat函数strncat函数模拟实现3.strncmp函数strncmp函数模拟实现一、前言      前面我们介绍过了strcpy、strcat、strcmp但是这些函数遇到'\0'才会停止,这些函数不会顾及目的地内存空间的大小,只会一直使用直到遇到\0...

 目录

一、前言

二、strncpy strncat  strncmp函数介绍 

1.strncpy函数

strncpy函数模拟实现

2.strncat函数

strncat函数模拟实现

3.strncmp函数

strncmp函数模拟实现




一、前言

      前面我们介绍过了strcpy、strcat、strcmp但是这些函数遇到'\0'才会停止,这些函数不会顾及

目的地内存空间的大小,只会一直使用直到遇到\0,所以这些函数是不安全的(常会发生越界访

问,和非法访问)。



二、strncpy strncat  strncmp函数介绍 

1.strncpy函数

函数的参数形式char *strncpy(char*destination,const char *source,size_t num)

其中size_t表示的是无符号整数,单位是字节。

num是选择拷贝多少个,注意:如果拷贝的个数大于源头的个数则多余的个数

全拷贝'\0'。该函数也是只能拷贝字符滴,且目的地的空间要足够大。

函数的使用:

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

int main()
{
  char arr1[30]={"kongchao"};

 char arr2[30]={"hello world"};

strncpy(arr2,arr1,9);//拷贝九个是因为第九个字节是'\0'

printf("%s",arr2);

 return 0;
}

strncpy函数模拟实现

#include<stdio.h>

#include<assert.h>

char*strncpy(char*dest,char*src,int k)
{
  assert(dest&&src);//判断非空

   char*nb=dest;

   while((*dest++ = *src++)&&(k--))
    {
         ;

    }
 
   return nb;
}


int main()
{
 char arr1[30]={"ni shi hei ma"};

 char arr2[30]={"ni na nie"};

 int k=0;

 printf("请输入你要拷贝的字节数");//空格不算个数里面

 scanf("%d",&k);

 char*ret=my_strncpy(arr1,arr2,k);

 printf("%s",arr1);//写ret也是一样的(都是arr1的首元素地址)

 return 0;
}

2.strncat函数

函数的参数形式char*strncat(char*dest,const char*src,size_t num)

这个函数的形式简直和上面那个strncpy一模一样(他们的模拟实现也是基本一样的,

可以说strncpy是strncat的子集)注如果连接的个数大于源头个数,则还是连接源头个数。

函数使用:

#include<stdio.h>

#include<string.h>
int main()
{ 
 char arr2[30]={"zhangdahou"};
 char arr1[30]={"xiaoshihou"};
 strncat(arr1,arr2,6);//连接6个
 printf("%s",arr1);

 return 0;
}

注意如果是这种strncat(arr1+n,arr2,8);其中n小于等于arr1的长度,则arr2还是连接到arr1后面,若大于则报错

strncat函数模拟实现

#include<stdio.h>
#include<assert.h>

char*my_strncat(char*dest,char*src)
 {
   assert(dest&&src);

   char*ret=dest;//记下开始的位置

   while(*++dest)
     {
       ;
     }
  while(*dest++=*src++)
     {
        ;
     }
 return ret;
 }

int main()
{ 
 char arr1[50]={"kong chao yao "};

 char arr2[30]={"cheng wei da niu"};

 char*kc= my_strncat(arr1,arr2);

 printf("%s",kc);

return 0;
}

3.strncmp函数

函数的参数形式int strncmp ( const char * str1, const char * str2 ,size_t num);

size_t表示无符号整形,num表示字符比较的个数,返回类型str1>str2返回大于0的数

str1=str2返回0,str1<str2,返回小于0的数。(vs默认返回1 0 -1)。

函数的使用

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

int main()
{
	char arr1[4] = { "asdf" };

	char arr2[4] = { "ase" };

	int dd=strncmp(arr1, arr2, 3);//arr1和arr2比较

	printf("%d\n", dd);//结果是小于0的随机数

	return 0;
}

strncmp函数模拟实现

#include<stdio.h>
#include<assert.h>

int my_strncmp(char*str1, char*str2,int k)
{
   assert(str1&&str2);

	while ((*str1== *str2) && (k--))
	{
		str1++; str2++;

		if ((*str1 == '\0') || (k == 0))
		{
			return 0;
		}
	}
	return *str1 - *str2;
}
int main()

{
	char arr1[10] = { "abcdega" };

	char arr2[10] = { "abcdeg" };

	int kc = my_strncmp(arr1, arr2, 7);
	printf("%d\n", kc);

	return 0;

最后的最后给个一键三连呗,学有所成呀

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。