char *my_strcpy(char *dst,const char *src)
如果注意到:
1,檢查指標有效性;
2,返回目的指標des;
3,源字串的末尾 '\0' 需要拷貝。
寫出上面實現函式就不在話下。
然而這樣的實現沒有考慮拷貝時記憶體重疊的情況,下面的測試用例就能使呼叫my_strcp函式的程式崩潰:
[cpp]view plain
copy
char str[10]="abc";
my_strcpy(str+1,str);
然而呼叫系統的strcpy函式程式正常執行,列印str結果為「aabc」!可見系統strcpy函式的實現不是這樣的。
strcpy的正確實現應為:
ew plain
c
char *my_strcpy(char *dst,const char *src)
memcpy函式實現時考慮到了記憶體重疊的情況,可以完成指定大小的記憶體拷貝,它的實現方式建議檢視文章「卓越的教練是如何訓練高手的?」,會獲益良多,這裡僅粘帖函式memcpy函式的實現:
真正的
char *strncpy(char *dst, const char *src, size_t len)
else
return res;
}
那麼,如果要處理記憶體重疊,該怎麼辦?如果記憶體重疊和src的長度小於len這兩種情況同時出現,又如何處理?
見圖,假設紅色部分為src,黃色為dst。如果出現記憶體重疊,我們很容易想到:從後往前拷貝。如果src的長度小於len,則在後面補nul。
char *strncpy(char *dst, const char *src, size_t len) if (dst >= src && dst <= src + len - 1)//重疊,從後向前複製 else while (offset--) return res; }
在函式strcpy和函式memcpy都沒有對記憶體重疊做處理的,使用這兩個函式的時候只有程式設計師自己保證源位址和目標位址不重疊,或者使用memmove函式進行記憶體拷貝。
memmove函式對記憶體重疊做了處理。
函式原型:
void
*memcpy(
void
*dest,
const
void
*src, size_t count );
void
*memmove(
void
* dest,
const
void
* src, size_t count );
1.memcpy和memmove相同點
都是用於從src拷貝count個位元組到dest。
2.memcpy和memmove區別
如果目標區域和源區域有重疊的話:
memcpy不能夠確保源串所在重疊區域在拷貝之前被覆蓋。
memmove能夠保證源串在被覆蓋之前將重疊區域的位元組拷貝到目標區域中,複製後src內容會被更改,當目標區域與源區域沒有重疊則和memcpy函式功能相同。
但當源記憶體和目標記憶體存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。
memmove的處理措施:
(1)當源記憶體的首位址等於目標記憶體的首位址時,不進行任何拷貝
(2)當源記憶體的首位址大於目標記憶體的首位址時,實行正向拷貝
(3)當源記憶體的首位址小於目標記憶體的首位址時,實行反向拷貝
實現strstr
leetcode 28
class solution
if (j == n) return i;
}return -1;}};
Strstr和Strchr函式詳解
strstr函式原型char strstr const char string,const char strcharset strstr函式功能 庫函式下的strstr include include intmain else return0 模擬實現strstr 當 start!0 的時候,就把s...
strcmp函式和strcpy函式
一 strcmp函式 strcmp函式是比較兩個字串的大小,返回比較的結果。一般形式是 i strcmp 字串1,字串2 其中,字串 字串 均可為字串常量或變數 i 是用於存放比較結果的整型變數。比較結果是這樣規定的 字串1小於字串2,strcmp函式返回乙個負值 字串1等於字串2,strcmp函式...
strcpy函式和strcat函式
將兩個char型別連線。char d 20 goldenglobal char s view strcat d,s 結果放在d中 printf s d 輸出 d 為 goldenglobalview 中間無空格 d和s所指記憶體區域不可以重疊且d必須有足夠的空間來容納s的字串。返回指向d的 指標。原...