為什麼這篇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)