strcpy实现
常見strcpy實現
一個常見的strcpy實現如下:
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是否已經指向同一塊內存,若是則直接返回
7 return dst;
8
9 char *tmp = dst;
10 while ((*dst++ = *src++) != '') // 注意在dst末尾加上''
11 ;
12
13 return tmp; // 在這里可能會不假思索就返回dst,但這樣是有問題的,因為dst經過累加后實際已指向''的下一塊內存
14 }
針對strcpy還有常見的一個問題就是:為什么要返回char *?
因為要讓strcpy支持鏈式賦值,例如:
strlen(strcpy(new char[20], src));
考慮內存重疊
對于strcpy而言,該函數并沒有考慮內存重疊的問題,例如
1 char s[10]="hello"; 2 strcpy(s, s+1); //應返回ello, 3 // strcpy(s+1, s); // 應返回hhello,但實際會報錯,因為dst與src重疊了,把''覆蓋了
所謂重疊,就是src未處理的部分已經被dst給覆蓋了,只有一種情況:src<=dst<=src+strlen(src)。
C函數memcpy自帶內存重疊檢測功能,下面給出memcpy的實現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) // 內存重疊,從高地址開始復制
8 {
9 dst = dst + cnt - 1;
10 src = src + cnt - 1;
11 while (cnt--)
12 *dst-- = *src--;
13 }
14 else // 正常情況,從低地址開始復制
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是否已經指向同一塊內存,若是則直接返回
29 return dst;
30
31 char *tmp = dst;
32 my_memcpy(dst, src, strlen(src) + 1); // 注意strlen并不會將‘O’統計在內
33
34 return tmp;
35 }
參考資料
strcpy函數的實現
總結
- 上一篇: 肠胃炎能不能吃粽子
- 下一篇: 关于旋转(Rotation)