strcpy,strcmp,strcat,memcpy,memmov,memset,memcmpの実現
// [11/10/2013 qingezha] , ,
char* strcpy_my(char * dest,char * src) // src dest
{
if(!src||!dest)
return NULL;
char* stedest = dest; //
while ((*dest++ = *src++)!='\0'); // !!!!!!!!!!
return stedest; // src dest
}
strcpyは文字のみで、memcpyはメモリに対して、中にどんな内容が保存されているかにかかわらず、内蔵タイプとカスタムタイプをコピーすることができます.その他はstrcpyと同じように、上書きの問題を考慮しません.
// [9/22/2013 qingezha] , void ++
// ,memcpy ,
// memmove , 。
void * my_memcpy(void *des, void *src, size_t count)
{
if(des == NULL || src == NULL || count <= 0)
return NULL;
char *dess = (char *)des; //
char *srcs = (char *)src;
char *ret = dess;
int temp = count;
while(count)
{
*dess++ = *srcs++;
--count;
}
*(ret + temp) = '\0';
return ret;
}
memmov移動時に上書き問題を考慮し、宛先アドレスとソースアドレスの相対位置に応じて、後から前へコピーするか、前から後へコピーするか// [9/24/2013 qingezha]
void * my_memmov(void *dest, void *src, size_t n)
{
{
char* d = (char*) dest;
const char* s = (const char*) src;
if (s>d) // ,
{
while (n--)
*d++ = *s++;
}
else if (s<d) // ,
{
d = d+n-1;
s = s+n-1;
while (n--)
*d-- = *s--;
}
return dest;
}
}
memsetは、メモリ領域を1文字または他の文字に設定するために使用されます.// [11/10/2013 qingezha]
void* my_memset(char *ch,char c,size_t n)
{
if(ch==NULL || n<=0)
return ch;
for (int i=0;i<n;i++)
{
ch[i]=c;
}
return ch;
}
memcmpメモリ内の対応する値のサイズを比較
int my_memcmp(const void *buf1,const void *buf2,size_t count)
{
if (buf1==NULL||buf2==NULL||count<=0)
{
return 0;
}
while(count--&&*(char*)buf1==*(char*)buf2)
{
buf1=(char*)buf1+1;
buf2=(char*)buf2+1;
}
return *(char*)buf1-*(char*)buf2;
}
strcat文字接続
// [11/10/2013 qingezha]
char * my_strcat(char *des,const char *src)
{
if (des==NULL||src==NULL)
{
return des;
}
char *ch = des;
while(*ch)
ch++;
while(*ch++=*src++);
return des;
}
strcmp文字列比較
// [11/10/2013 qingezha]
int my_strcmp(const char *des,const char *src)
{
int dis=0;
while(!(dis=*des-*src)&&*des&&*src)//
{
src++;
des++;
}
if (dis>0)
{
dis = 1;
}
else
{
dis = -1;
}
return dis;
}