[爆卦]strcpy c實作是什麼?優點缺點精華區懶人包

為什麼這篇strcpy c實作鄉民發文收入到精華區:因為在strcpy c實作這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者tropical72 (藍影)看板C_and_CPP標題Re: [問題] strcpy的函數定義...


※ 引述《besmartAE (Oliver奧立佛)》之銘言:
: 今天面試的時候有一題,關於strcpy的函數定義
: 函數原始定義
: char *strcpy(char *dest, char *source);
: 請問為何需要傳回dest的指標?改成下面這行是否可行?
: void strcpy(char *dest, char *source)
: 試說明之...

其實我覺得這問題還蠻牛角尖的,且我認為真的只是要考思考、想法而已。
硬要擠原因的話大概與 chanting 所言無二異,做結合用。

下面的東西看看就好,有不同看法歡迎討論。

---------

我認為 strcpy 有個地方其實沒設計的很好

#include <stdio.h>
#include <string.h>
#define BUF_SIZE1 1000
#define BUF_SIZE2 10

int main()
{
const char src[BUF_SIZE1]="123456789012345678901234567890...";
char des[BUF_SIZE2];
char *ptr = strcpy(des, src);
printf("src:%s\ndes:%s\nptr:%s\n", src, des, ptr);
return 0;
}

這段 code 會發生什麼事確實沒人會知道,
其實還是有極少機會會發生 - strcat 幾次、再 strcpy 就發生了,
大多都是出現 stack overflow 問題,
且這問題未必具有重現性,以我「僥倖」跑過後,得到的結果如下

src:345678901234567890...
des:123456789012345678901234567890...
ptr:123456789012345678901234567890...

最後發現:用 strcpy 在這時候 (當然是我幹了傻事的結果),des!=src ,
更離譜的是,const src 也被吃掉了。而 ptr 卻仍沒防呆作用?

assert(strcmp(strcpy(des, src), src));

還要再加這段的話,那幹嘛不一開始在有問題的時候就傳回 NULL,
還要硬指向 des?

嗯,我想 M$ 所有 _s 系列 (strcpy_s, strcmp_s...) 函式應是這樣出來的。

淺見,歡迎指正。

--
YouLoveMe() ? LetItBe() : LetMeFree();

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.73.222
※ 編輯: tropical72 來自: 180.177.73.222 (07/01 04:35)
legnaleurc:strncpy 07/01 05:26
singlovesong:這應該叫做buffer overrun 07/01 10:44
angleevil:其實去查一下wiki,有用c實作strcpy,只是單純一個字元 07/01 14:41
angleevil:慢慢複製到dest,所以也無法回傳null,我反而單純認為 07/01 14:44
angleevil:這是一個設計的習慣.也有結合其他string函式的考量吧 07/01 14:46
firejox:t大 你的assert的部份少一個括號... 07/01 19:16
※ 編輯: tropical72 來自: 180.177.73.222 (07/01 19:19)
tropical72:謝謝指正。 07/01 19:19

你可能也想看看

搜尋相關網站