1. 程式人生 > >如何自己實現字串拷貝函式

如何自己實現字串拷貝函式

一般寫法:


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;
    }