看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
poyenc:感謝little大釐清概念, http://ppt.cc/1Vvf null ptr const 10/24 16:44
fatb:我觀念不對 感謝littleshan >< 10/24 16:45
poyenc:實際上為評估值為0的常數敘述, 所以<stddef.h>的定義才會為 10/24 16:46
poyenc:implementation-defined null pointer constant 10/24 16:48