【基礎C&C++】內存拷貝strcpy,memcpy,memmove,strncpy源碼

strcpy

char *strcpy(char*strDest, const char *strSrc)
{
    assert((strDest!=NULL) && (strSrc!=NULL));
    char *address = strDest;    
    while( (*strDest++ = * strSrc++) != '\0')
       NULL ;
    return address ;      

}

memmove

void *memmove(void *dst, const void*src, size_tcount)
{
       void* ret = dst;
       if(dst <= src || (char *)dst >= ((char *)src + count)) {//不重疊或,拷貝不覆蓋還未讀的src
              while (count--) {
                     *(char *)dst = *(char *)src;
                     dst = (char *)dst + 1;
                     src = (char *)src + 1;
              }
       }
       else{//逆向拷貝
              dst= (char *)dst + count - 1;
              src= (char *)src + count - 1;
              while(count--) {
                     *(char*)dst = *(char *)src;
                     dst= (char *)dst - 1;
                     src= (char *)src - 1;
              }
       }
       return(ret);

}

memcpy

和strcpy一樣

void *memcpy(void*pvTo, void* pvFrom, size_t size) //byte是java裏的變量類型
{
         void * ret = dst;

         while (count--) {
                   *(char *)dst = *(char *)src;
                   dst = (char *)dst + 1;
                   src = (char *)src + 1;
         }
         return(ret);
}

memset

void* memset(void* buffer, int c, int count)
{
       char* pvTo=(char*)buffer;
       assert(buffer != NULL);
       while(count-->0)
              *pvTo++=(char)c;
       return buffer;
}

strncpy

char *  strncpy (char * dest,const char * source,size_tcount)
{
         char *start = dest;

         while (count && (*dest++ =*source++)) /* copy string */
                   count--;

         if (count) /* pad out with zeroes */
                   while (--count)
                            *dest++ = '\0';
         return(start);
}


發佈了34 篇原創文章 · 獲贊 15 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章