日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

strcpy实现

發布時間:2024/5/24 综合教程 48 生活家
生活随笔 收集整理的這篇文章主要介紹了 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函數的實現

總結

以上是生活随笔為你收集整理的strcpy实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。