作者poyenc (高髮箍)
看板C_and_CPP
標題Re: [問題] 想請問一提 關於自己寫字串拷貝函式
時間Sun Oct 23 00:53:57 2011
※ 引述《kevinqaz (阿楷)》之銘言:
: C++開發平台(Platform)
: 程式碼(Code)
: 下面的strcopy()是一個字串拷貝函式, 功能是將s所指向的字串複製到d所指向的buffer
: 中.
: void strcopy(char* d, char* s)
: {
: }
: int main(void)
: {
: char a[] = "Hello world";
: char b[50];
: strcopy(b, a);
: printf("%s\n", b);
: return 0;
: }
: 請問要如何完成他呢
: 試了好久還是弄不出來ORZ
考慮字串在記憶體中的位置(字太多懶得打):
┌─┬─┬─┬─┬─┬─┬─┐
"hello!" → │h│e│l│l│o│!│
\0│
└─┴─┴─┴─┴─┴─┴─┘
注意除了雙引號括起來的字, 最後還有一個'\0', 所以需要複製字
數看也知道是 7
void strcopy(
char* d,
char* s)
{
d[0] = s[0];
// copy 'h'
d[1] = s[1];
// copy 'e'
d[2] = s[2];
// copy 'l'
d[3] = s[3];
// copy 'l'
d[4] = s[4];
// copy 'o'
d[5] = s[5];
// copy '!'
d[6] = s[6];
// copy '\0'
}
以題目要求來看這樣就可以交差了, 如果要複製的字多一點, 你就
再加個幾行進去, 非常簡單!
然後你就會發現這樣很白痴, 助教把 a存的字串加長一點你程式就
當掉了, 重複執行同樣的敘述還是要用最合適的迴圈:
d[ 0 ] = s[ 0 ];
// copy first char
// ...
即使是空字串, 這樣的敘述也是安全的, 再來就是一股腦的複製直
到複製了'\0'結束字元, 表示函式的工作完成可以讓它結束:
int i = 0;
d[ i ] = s[ i ];
// copy first char, d[ 0 ] = s[ 0 ]
while( d[ i ] != '\0' ) {
// loops until copy a '\0' char
i++;
// move forward, copy the next char
d[ i ] = s[ i ];
}
完成.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.221.213
推 tomnelson:不是最家姐卻是正姐,給個推! 10/23 01:15
推 xatier:打字很麻煩,只好畫圖了XD 10/23 01:21
推 villix:那我只好推正姐了 10/23 01:27
推 kevinqaz:我一開始就是用這樣可是覺得不好看才來問的orz 10/23 21:13
→ angleevil:...別在問了,其實早就有人給你答案 10/23 21:14
→ poyenc:你覺得不好看的點在哪?因為不夠簡短看起來不高竿嗎? 10/23 21:17
→ tropical72:這方式未必比其他方式慢唷!! 看得懂才是第一需求。 10/23 21:58
※ 編輯: poyenc 來自: 140.121.197.115 (10/23 22:13)
→ firejox:改好快0_0 10/23 22:13
→ fatb:while(d[i])就可以了 '\0' = null = False 10/23 22:18
→ firejox:寫的不好看.....就要忍耐呀!!! KISS原則是很重要的~~ 10/23 22:19
→ poyenc:'\0' 是byte中所有bits都為零, 可以說它跟 false 相等, 但 10/23 22:27
→ poyenc:是 NULL 值不一定為零 10/23 22:27
→ xatier:NULL 跟 NUL('\0') 不一樣吧 10/24 01:02
推 littleshan:NULL 一定是零,它叫 "null pointer constant" 10/24 02:41
→ littleshan:NULL 轉型成指標後稱為 null pointer,不一定為零 10/24 02:42
→ xatier:字串結尾是 \0 字元... 跟 NULL 不一樣吧....@@? 10/24 04:28
→ xatier:就我所知,NULL 一般用在指標相關的東西,NUL 字元是 \0 10/24 04:28
→ xatier:ascii 表第一個char 10/24 04:29
→ fatb:我觀念不對 感謝littleshan >< 10/24 16:45
→ poyenc:實際上為評估值為0的常數敘述, 所以<stddef.h>的定義才會為 10/24 16:46
→ poyenc:implementation-defined null pointer constant 10/24 16:48