作者weii (迷惑失道)
看板SFFamily
标题[转录]Re: [转录]Re: [心得] 如何向别人证明自己写的是好 …
时间Tue Nov 20 11:52:17 2007
※ [本文转录自 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)
1F:推 Rukawa31:谢谢 学到宝贵的一课 11/18 14:56
2F:→ Rukawa31:在学校写作业从来不会考虑到这种问题 11/18 14:56
--
三月的柳絮不飞 你的心如小小的寂寞的城
我达达的马蹄是美丽的错误 我不是归人 我是马~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.117.169