做某題用到了sprintf把一個字符數組(字符串)寫到二維字符數組里,然后耗時挺長的,想了想strcpy好像也可以,事實證明strcpy效率果然更高,然后想了想覺得memcpy好像也可以。實踐了一下的確可以,效率不用說也比sprintf高,畢竟memcpy是對內存操作。然后我就百度了一下它們的區別,做個總結(記筆記)。
- sprintf 可以用%s來實現格式化寫入,其他兩個做不到。
- strcpy 遇到\0結束(\0也被復制了),只能拷貝字符串。
- memcpy 根據size大小來復制,可以復制各種數據類型(結構體、數組)。
對於拷貝字符串,我們選擇strcpy,因為memcpy還需要提供size參數,且strcpy另一個優勢是返回值是char *,也就是目標字符串的首地址,這樣可以寫鏈式表達式:
strlen(strcpy(s1,strcpy(dest,src)));
strcpy的實現
char *strcpy(char *strDest, const char *strSrc);// 實現strSrc到strDest的復制 { if ((strSrc == NULL) || (strDest == NULL)) //判斷參數有效性 { return NULL; } char *dest = strDest; //保存目標字符串的首地址 while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內容復制到dest下 return dest; }
memcpy的實現
void *memcpy(void *memTo, const void *memFrom, size_t size) { if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效 return NULL; char *tempFrom = (char *)memFrom; //保存memFrom首地址 char *tempTo = (char *)memTo; //保存memTo首地址 while(size -- > 0) //循環size次,復制memFrom的值到memTo中 *tempTo++ = *tempFrom++ ; return memTo; }