[轉錄]Re: [轉錄]Re: [心得] 如何向別人證明自己寫的是好 …

看板SFFamily作者 (迷惑失道)時間16年前 (2007/11/20 11:52), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ [本文轉錄自 C_and_CPP 看板] 作者: UNARYvvv (有趣生活) 看板: C_and_CPP 標題: Re: [轉錄]Re: [心得] 如何向別人證明自己寫的是好 … 時間: Sat Nov 17 05:17:13 2007 首先當然是 strncpy 用法要先清楚啦.. 然後底下是一些例子 第三個引數直接傳 strlen(src) 為何不妥: 若 src buffer 較小 char dst1[3] = {0xCC,0xCC,0xCC}; // 假設這是未初始化的情況 char src1[] = "AB"; strncpy(dst1, src1, strlen(src1)); dst1 會變成 {'A','B',0xCC},沒有結尾 0 若 dst buffer 較小 char dst2[3], src2[] = "ABCDE"; strncpy(dst2, src2, strlen(src2)); dst2 buffer 不夠容納 strlen(src2) 個字元 ======== 另外若第三引數傳入 sizeof(dst) 的話 若 dst 宣告為指標而非陣列,那就錯了 若 dst 是陣列,那最多也只能傳 sizeof(dst)-1 然後自己幫 dst 補結尾 0 ========== 所以一般說 strncpy 能獲得在安全方面好處的話,會是這樣用: dst buffer 較小 char dst3[3], src3[] = "ABCDE"; strncpy(dst3, src3, 2); // 此例可用 sizeof(dst3)-1 dst3[2] = '\0'; printf("dst3 = %s\n", dst3); // dst3 = AB 沒有超出 dst buffer src buffer 較小 char dst4[3], src4[] = "A"; strncpy(dst4, src4, 2); // 此例可用 sizeof(dst4)-1 dst4 現在為 {'A',0,??} 所謂自動補結尾 0 的情況是這時候 也就是 「strlen(來源字串) < 第三引數值」 的時候 這時 dst4 已經可以作為正常的字串使用了 不過由於一般我們事前可能並不知道 src 字串長度 所以實用上還是會自己補 0 dst4[2] = '\0'; printf("dst4 = %s\n", dst4); // dst4 = A 簡單來說 strncpy 第三個參數的存在,是為了不讓複製動作超出了[目的地 buffer] 所以光是傳入跟[來源字串]有關的資訊根本沒有用 這樣很容易知道原本那篇的推文哪些錯了吧XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.114.113 ※ 編輯: UNARYvvv 來自: 220.132.114.113 (11/17 05:19)

11/18 14:56,
謝謝 學到寶貴的一課
11/18 14:56

11/18 14:56,
在學校寫作業從來不會考慮到這種問題
11/18 14:56
-- 三月的柳絮不飛 妳的心如小小的寂寞的城 我達達的馬蹄是美麗的錯誤 我不是歸人 我是馬~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.117.169
文章代碼(AID): #17GbdogK (SFFamily)