strncpy、strncat、memcpy、memmove的模拟实现
2024-01-02 21:31:01
strncpy
原型:char* strncpy(char* dest,const char* src,size_t n)
功能:从源字符串src第一个字符开始复制n个字符到目标字符串dest,返回dest字符串首地址。
注意点:1.dest字符串要足够长,可以容纳n个字符。 2.当src不够n个字符时,会复制src最多的字符。? 3.复制完字符后,会在结尾自动添加'\0',作为结束符。
//1.第一种方法
#include <stdio.h>
char* my_strncpy(char* dest,char* src,size_t n)
{
char* temp = dest;
while (*src && n)
{
*dest++ = *src++;
n--;
}
*dest = '\0';
return temp;
}
//2.第二种方法
char* my_strncpy1(char* dest, char* src, size_t n)
{
int i = 0;
for (i = 0; src[i] && i < n; i++)
{
dest[i] = src[i];
}
if (i < n)//加不加都行,i肯定小于n
{
dest[i] = 0;//'\0'
}
return dest;
}
int main()
{
char ch1[] = "xxxxxxxxxx";
char ch2[] = "hello world!";
char ch3[] = "he";
printf("%s", my_strncpy(ch1, ch3, 5));
return 0;
}
strncat
原型:char* strncat(char* dest,const char* src,size_t n)
功能:从源字符串src第一个字符开始追加n个字符到目标字符串dest的'\0'处,返回dest字符串首地址。
注意点:1.dest字符串要足够长,可以容纳追加后的字符总数。 2.当src不够n个字符时,会追加src最多的字符。? 3.追加完字符后,会在结尾自动添加'\0',作为结束符。
#include <stdio.h>
//第一种方法
char* my_strncat(char* dest, char* src, size_t n)
{
int x = 0;
while (dest[x])
{
x++;
}//退出循环后,x偏移对应的dest[x]=0;
int i = 0;
for (i = 0; src[i] && i < n; i++)
{
dest[x++] = src[i];
}
dest[x] = 0;//'\0'
return dest;
}
//第二种方法
char* my_strncat1(char* dest, char* src, size_t n)
{
int* temp = dest;
while (*dest)
{
dest++;
}
int i = 0;
for (i = 0; src[i] && i < n; i++)
{
dest[i] = src[i];
}
dest[i] = 0;//'\0'
return temp;
}
int main()
{
char ch1[20] = "hello";
char ch2[] = "hello world!";
char ch3[] = "he";
printf("%s", my_strncat(ch1, ch2, 5));
return 0;
}
memcpy
模拟memcpy ? ? 原型:char* memcpy(void* dest,void* src,size n)?
功能:可接收任意相同类型的dest和src,从src复制n个字节到dest,返回dest起始地址
src和dest不能是同一个字符串的不同位置。同一个字符串的不同位置要用到memmove,看下面的memmove的模拟实现。
#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* dest, const void* src, size_t n)
{
assert(dest && src);
void* temp = dest;
while (n--)
{
*(char*)dest = *(char*)src;
((char*)dest)++;
((char*)src)++;
}
return temp;
}
int main()
{
int a = 0x11223344;
int b = 0;
int* p=my_memcpy(&b,&a, 2);
printf("%#x", *p);
return 0;
}
memmove
功能:可接收任意相同类型的dest和src,从src复制n个字节到dest,返回dest起始地址 ? src和dest可以是同一字符串的不同位置
#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t n)
{
assert(dest && src);
void* temp = dest;
if (dest < src)
{
while (n--)
{
*(char*)dest = *(char*)src;
((char*)dest)++;
((char*)src)++;
}
}
else
{
while (n--)
{
*((char*)dest+n) = *((char*)src+n);
}
}
return temp;
}
int main()
{
int a = 0x11223344;
//int* p = my_memmove(&a, ((char*)&a + 2), 2);//0x11221122
//printf("%#x", *p);
my_memmove(((char*)&a + 2), &a, 2); //0x33443344
printf("%#x", a);
return 0;
}
文章来源:https://blog.csdn.net/qq_52907930/article/details/135312978
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!