作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] strcpy的函數定義
時間Fri Jul 1 04:29:45 2011
※ 引述《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