strcpy实现
常見strcpy實(shí)現(xiàn)
一個常見的strcpy實(shí)現(xiàn)如下:
1 char *my_strcpy(char *dst, const char *src)
2 {
3 if (dst == nullptr || src == nullptr) // 寫成!dst或dst == 0都不推薦
4 return nullptr;
5
6 if (dst == src) // 判斷dst和src是否已經(jīng)指向同一塊內(nèi)存,若是則直接返回
7 return dst;
8
9 char *tmp = dst;
10 while ((*dst++ = *src++) != '') // 注意在dst末尾加上''
11 ;
12
13 return tmp; // 在這里可能會不假思索就返回dst,但這樣是有問題的,因?yàn)閐st經(jīng)過累加后實(shí)際已指向''的下一塊內(nèi)存
14 }
針對strcpy還有常見的一個問題就是:為什么要返回char *?
因?yàn)橐宻trcpy支持鏈?zhǔn)劫x值,例如:
strlen(strcpy(new char[20], src));
考慮內(nèi)存重疊
對于strcpy而言,該函數(shù)并沒有考慮內(nèi)存重疊的問題,例如
1 char s[10]="hello"; 2 strcpy(s, s+1); //應(yīng)返回ello, 3 // strcpy(s+1, s); // 應(yīng)返回hhello,但實(shí)際會報(bào)錯,因?yàn)閐st與src重疊了,把''覆蓋了
所謂重疊,就是src未處理的部分已經(jīng)被dst給覆蓋了,只有一種情況:src<=dst<=src+strlen(src)。
C函數(shù)memcpy自帶內(nèi)存重疊檢測功能,下面給出memcpy的實(shí)現(xiàn)my_memcpy。
1 char *my_memcpy(char *dst, const char *src, int cnt)
2 {
3 if (dst == nullptr || src == nullptr)
4 return nullptr;
5
6 char *tmp = dst;
7 if (dst >= src && dst <= src + cnt - 1) // 內(nèi)存重疊,從高地址開始復(fù)制
8 {
9 dst = dst + cnt - 1;
10 src = src + cnt - 1;
11 while (cnt--)
12 *dst-- = *src--;
13 }
14 else // 正常情況,從低地址開始復(fù)制
15 {
16 while (cnt--)
17 *dst++ = *src++;
18 }
19
20 return tmp;
21 }
22
23 char *my_strcpy(char *dst, const char *src)
24 {
25 if (dst == nullptr || src == nullptr) // 寫成!dst或dst == 0都不推薦
26 return nullptr;
27
28 if (dst == src) // 判斷dst和src是否已經(jīng)指向同一塊內(nèi)存,若是則直接返回
29 return dst;
30
31 char *tmp = dst;
32 my_memcpy(dst, src, strlen(src) + 1); // 注意strlen并不會將‘O’統(tǒng)計(jì)在內(nèi)
33
34 return tmp;
35 }
參考資料
strcpy函數(shù)的實(shí)現(xiàn)
總結(jié)
- 上一篇: 肠胃炎能不能吃粽子
- 下一篇: 关于旋转(Rotation)