/*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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/a5bc4ca5eb92acb3e5b587bcd17d4f06.png)
//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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/13f329e9a3db5c2aa14c2111954704f3.png)
//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;
}
![](https://i-blog.csdnimg.cn/blog_migrate/896e9e62bb801b4f49553f005bde1d24.png)