看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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