mem函數源碼
1.memcpy函數
- 原型:
void *memcpy(void *dest, const void *src, int count)
- 作用:由src指定記憶體區域拷貝count個字元到dest所指定的記憶體區域。
- 代碼:
void *my_memcpy(void *dest, const void *src, int count)
{
/*由src指定記憶體區域拷貝count個字元到dest所指定的記憶體區域。
src和dest記憶體區域不能重疊,函數傳回指向dest的指針。*/
//拷貝完成不會自動加上'\0'
unsigned char *p = (unsigned char *)dest;
unsigned char *q = (unsigned char *)src;
while(count--)
{
*p++ = *q++;
}
return dest;
}
int main()
{
char a[];
char *p;
p = (char *)my_memcpy(a, "hello world!", );
*(p+) = '\0'; //為puts做準備
puts(a);
return ;
}
2.memccpy函數
- 原型:
void *memccpy(void *dest, const void *src, char ch, int count)
-
作用:如果src前n個位元組中存在’ch’,傳回指向字元’ch’後的第一個字元的指針;
傳回NULL,并且複制src。
- 代碼:
#include <string.h>
void *my_memccpy(void *dest, const void *src, char ch, int count)
{
/*如果src前n個位元組中存在’ch’,傳回指向字元’ch’後的第一個字元的指針;
傳回NULL,并且複制src。
一個條件達到就結束*/
//對于數字字元,遇見空格則停止,并傳回指向空格的指針
while(count--)
{
*(char *)dest = *(char *)src;
dest = (char *)dest + ;
if(*(char *)src == (char)ch)
break;
src = (char *)src + ;
}
return (count ? (char *)dest : NULL);
}
int main()
{
char a[];
char *p;
char *str ="hello world!";
char ch;
ch = '9';
p = (char *)my_memccpy(a, str, ch, strlen(str)+);
if(p == NULL)
printf("Can't not find character.\n");
else
{
printf("Find the character! \n");
*p= '\0'; //為下面的puts函數準備
}
printf("The String which has been copied is: ");
puts(a); //puts()從string的開頭往stdout中輸出字元,直到遇見結束标志 '\0','\0'不會被輸出到stdout。
printf("************************************");
ch = 'b';
p = (char *)my_memccpy(a, str, ch, strlen(str)+);
if(p == NULL)
printf("Can't not find character.\n");
else
{
printf("\nFind the character! \n");
*p = '\0';
}
printf("The String which has been copied is: ");
puts(a);
return ;
}
3.memmove函數
- 原型:
void *memmove(void *dest, const void *src, int count)
-
作用:由src所指定的記憶體區域指派count個字元到dest所指定的記憶體區域。
src和dest所指記憶體區域可以重疊
- 代碼:
#include <string.h>
void * my_memmove(void *dest, const void *src, int count)
{
/*由src所指定的記憶體區域指派count個字元到dest所指定的記憶體區域。
src和dest所指記憶體區域可以重疊,
但複制後src的内容會被更改,最終函數傳回指向dest的指針。*/
//可以自己考慮count的大小,大于0,小于src的大小
if((unsigned char *)dest >= ((unsigned char *)src + count))
{
/*若果沒有重疊*/
dest = memcpy (dest, src, count);
}
else
{
/*如果有重疊,則從尾部進行拷貝*/
unsigned char *p = (unsigned char *)dest + count;
unsigned char *q = (unsigned char *)src + count;
while (count--)
{
*--p = *--q;
}
}
return dest;
}
int main()
{
/*正常的複制*/
char a[];
puts((char *)my_memmove(a, "hello world!", ));
/*記憶體重疊*/
char str[] = "memmove can be very useful......";
my_memmove (str+, str+, );
puts (str);
return ;
}
4.memcmp函數
- 原型:
int memcmp(const void *buffer1, const void *buffer2, int count)
- 作用:比較記憶體區域buffer1和buffer2的前count個位元組。
- 代碼:
int my_memcmp(const void *buffer1, const void *buffer2, int count)
{
/*比較記憶體區域buffer1和buffer2的前count個位元組。
當buffer1 < buffer2時,傳回值 < 0;
當buffer1 = buffer2時,傳回值 0;
當buffer1 > buffer2時,傳回值 > 0。*/
if(!count)
return ;
while(--count && *(char *)buffer1 == *(char *)buffer2)
{
//判斷前count個字元是否相等
buffer1 = (char *)buffer1 + ;
buffer2 = (char *)buffer2 + ;
}
//傳回兩個字元串的首個字元的內插補點
return ( *((unsigned char *)buffer1) - *((unsigned char *)buffer2) );
}
int main()
{
char *str1 = "hello";
char *str2 = "world";
int n = ;
scanf("%d", &n);
int res = my_memcmp(str1, str2, n);
if(res > )
printf("%s Upper Than %s\n", str1, str2);
else if(res < )
printf("%s Lower Than %s\n", str1, str2);
else
printf("%s Equal %s\n", str1, str2);
return ;
}
5.memchr函數
- 原型:
void *memchr(const void *buffer, int ch, int count)
-
作用:從buffer所指記憶體區域的前count個位元組查找字元ch,
當第一次遇到字元ch時停止查找。
- 代碼:
#include <string.h>
void * my_memchr(const void *buffer, int ch, int count)
{
/*從buffer所指記憶體區域的前count個位元組查找字元ch,
當第一次遇到字元ch時停止查找。
如果成功,傳回指向字元ch的指針,否則傳回NULL*/
//對于數字字元,遇見空格則停止,并傳回指向空格的指針
while(count-- && (unsigned char)ch != *(unsigned char *)buffer)
{
buffer = (unsigned char *)buffer + ;
}
return(count ? (void *)buffer : NULL);
}
int main()
{
char *str = "hello world!";
char *p;
char ch;
ch = '1';
p = (char *)my_memchr(str, ch, strlen(str)+);
if(p == NULL)
printf("Can't find the character %c !\n", ch);
else
printf("Find the character %c !\n", *p);
ch = 'd';
p = (char *)my_memchr(str ,ch, strlen(str)+);
if(p == NULL)
printf("Can't find the character %c !\n", ch);
else
printf("Find the character %c !\n", *p);
return ;
}
參考文章
連結:
http://www.cnblogs.com/jiangyinglin/p/3247087.html