[轉錄]Re: [轉錄]Re: [心得] 如何向別人證明自己寫的是好 …
※ [本文轉錄自 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