如何自己實現字串拷貝函式
阿新 • • 發佈:2018-12-22
一般寫法:
char *my_strcpy(char *dst,const char *src)
{
assert(dst != NULL);
assert(src != NULL);
char *ret = dst;
while((* dst++ = * src++) != '\0') // 運算子優先順序++高於*
;
return ret;
}
可以看到很簡單,只需考慮三點。
1,判斷源字串和目的字串是否為空
2,現將目的地址指標儲存起來,方便輸出
3,遍歷原地址和目的地址,一個字元一個字元的複製,包括末尾的
但是上面的實現有問題,沒有考慮到記憶體重合的情況。原地址src和目的地址dst所在記憶體有下面三種情況。
對於1和3的情況,不影響。雖然1也有重疊,但是重疊部分不會破壞源字串內容。
對於,第二種情況,可以按照從後往前拷貝源字串內容到目的字串的思路進行處理。
void *do_copy(void *dst, const void *src, unsigned int count) { assert(dst); assert(src); void *ret = dst; if (dst <= src || (char *)dst >= ((char *)src + count)) //源地址和目的地址不重疊,低位元組向高位元組拷貝 { 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; } char *do_strcpy(char *dst, const char *src) { assert(dst != NULL); assert(src != NULL); char *ret = dst; do_copy(dst, src, strlen(src) + 1); return ret; }