memcpy函数的使用
void * memcpy ( void * destination, const void * source, size_t num );
destination是目的地址,source是传输地址,num是传输字节数,使用memcpy函数时会从source地址取出num个字节放在destination地址处。
#include "stdio.h"
#include <string.h>
int main()
{
int str1[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int str2[20] = { 0 };
memcpy(str2, str1, 32);//数组名即是首元素地址
for (int i = 0; i < 20; i++)
{
printf("%d ", str2[i]);
}
return 0;
}
输出结果:1 2 3 4 5 6 7 8 0 0 0 0 0 0 0 0 0 0 0 0
将32字节也就是8个整型从str1赋给str2。
值得注意的是,str1与str2的地址不应该重叠,如果重叠,应该使用memmove函数。同时这个函数在遇到 '\0' 的时候并不会停下来。
memmove函数的使用
void * memmove ( void * destination, const void * source, size_t num );
memmove函数的使用与memcpy函数的使用相差不大,但是memmove函数可以处理地址有重叠的情况。
int main()
{
int str1[] = { 1,2,3,4,5,6,7,8,9,10 };
memcpy(str1+4, str1, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ", str1[i]);
}
return 0;
}
输出结果:1 2 3 4 1 2 3 4 5 10
数组str1+4与数组str1的地址是部分重叠,这个情况使用memmove函数。
memset函数的使用
void * memset ( void * ptr, int value, size_t num );
顾名思义,set即设置,ptr是目标地址,value是设置的值,num是设置的值所需字节数。
int main()
{
int str1[] = { 1,2,3,4,5,6,7,8,9,10 };
memset(str1, 0, 40);
for (int i = 0; i < 10; i++)
{
printf("%d ", str1[i]);
}
printf("\n");
char str2[10]="abcdefghij";
memset(str2, 'x', 5);
for (int i = 0; i < 10; i++)
{
printf("%c ", str2[i]);
}
return 0;
}
输出结果:0 0 0 0 0 0 0 0 0 0
x x x x x f g h i j
memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
ptr1与ptr2是需要进行比较的两个字符串的首地址,num是需要进行比较多少个字节。
int main()
{
char str1[] = "abcdefg";
char str2[] = "abcdEfg";
int m=memcmp(str1, str2, 4);
if (m > 0)
printf("str1 > str2\n");
if (m < 0)
printf("str1 < str2\n");
if (m == 0)
printf("str1 == str2\n");
m = memcmp(str1, str2, 5);
if (m > 0)
printf("str1 > str2\n");
if (m < 0)
printf("str1 < str2\n");
if (m == 0)
printf("str1 == str2\n");
return 0;
}
输出结果:str1 == str2
str1 > str2