1.模拟实现strncpy 2.模拟实现strncat 3.模拟实现strncmp

/*1.模拟实现strncpy(字符串拷贝)
原型:char * strncpy(char *dest,  const char *src, size_t n);
功能:将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样只有遇到NULL才停止复制,而是多了一个条件停止,
就是说如果复制到第n个字符还未遇到NULL,也一样停止),返回指向dest的指针。
头文件:#include "string.h"
说明:
如果n > dest串长度,dest栈空间溢出产生崩溃异常。
否则:
1)src串长度 <= dest串长度, (这里的串长度包含串尾NULL字符)
如果n = (0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。
如果n = src串长度,与strcpy一致。
如果n = dest串长度,[0, src串长度]处存放于desk字串,(src串长度, dest串长度]处存放NULL。
2)src串长度>dest串长度
如果n = dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest最后一字符置为NULL。
综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),
复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生在第2)种情况下的输出乱码问题。当然喽,无论是strcpy还是strncpy,保证src串长度。*/
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<stdlib.h>
char *my_strncpy(char *dest, char* src, int n)
{
assert(src);
assert(dest);
assert(n > 0);
while(n&&*src)
{
*dest++=*src++;
n--;
}
return dest;
}
int main()
{
char str1[]= "ljjloveljj";//指针数组
char str2[]= "dwh";
int n=strlen(str2)+1;
my_strncpy(str1, str2, n);//n为str2的字符串长度(dwhloveljj),当n<10(传的参数),也是一样的输出
printf("%s", str1);
system("pause");
return 0;
}


//2.模拟实现strncat(字符串拼接)
/*原型:extern char *strncat(char *dest,const char *src, int n);
用法:#include <string.h>
功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。*/
#include<stdio.h>
#include<windows.h>
#include<assert.h>
#include<stdlib.h>
//#include<string.h>
#pragma warning(disable:4996)
char *my_strncat(char *dest, char* src, int n)
{
	assert(src);
	assert(dest);
	assert(n > 0);
	while (*dest)
	{
		dest++;
	}
	while (n&&*src)
	{
		*dest++ = *src++;
		n--;
	}
	return dest;
}
int main()
{
	char str1[32] = "ljjlove";
	char str2[] = "dwh";
	int n = strlen(str2);
	my_strncat(str1, str2, n);
	printf("%s", str1);
	system("pause");
	return 0;
}


//3.模拟实现strncmp(字符串比较)
/*函数名: strncmp ()
功 能:比较字符串的前num个字符
用 法:<string.h>
原型:int strncmp(const char *str1,const char *str2,size_t num)
说明:比较字符串str1和str2的大小,如果str1小于str2,返回值就<0(通常为-1),
反之如果str1大于str2,返回值就>0(通常为1),
如果str1等于str2,返回值就=0,num指的是str1与str2的比较的字符数。
此函数功能即比较字符串str1和str2的前num个字符。
提示:该函数区分大小写。
*/
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#pragma warning(disable:4996)
int my_strncmp(const char* dest, const char* src, int n)
{
	assert(dest);
	assert(src);
	int ret = 0; 
	int res = 0;
	while (n && !(ret = *(unsigned char*)dest - *(unsigned char*)src) && *dest)
	{
		src++;
		dest++;
		n--;
	}
		if (ret > 0)
		{
			res = 1;
		}
		else if (ret < 0)
		{
			res = -1;
		}
		else{
			res = 0;
		}
	return res;
}
int main()
{
	char *str1 = "123456789";
	char *str2 = "12abcde";
	//int n;
	//printf("please enter n:\n");
	//scanf_s("%d\n", &n);
	int ret=my_strncmp(str1, str2, 2);
	printf("%d\n",strncmp(str1, str2, 4));
	printf("%d", ret);
	system("pause");
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值