读书人

讨论一种常见的不好的strncpy写法解

发布时间: 2012-02-25 10:01:47 作者: rapoo

讨论,一种常见的不好的strncpy写法
我经常看到一些朋友写代码时strncpy函数是这么用的。

例如
char dest[10] = 0;
strncpy(dest, source, sizeof(dest));

很多人包括很多老手都是这么写的, 但是这样如果source长度大于等于sizeof(dest)时dest字符串就不能正确结束。
我就在疑问, 他们为什么不这么样呢??
char dest[10] = 0;
strncpy(dest, source, sizeof(dest) - 1);

虽然很简单,但我就想不通, 是多心了, 还是这些老手还不能算传说中的高手?

[解决办法]
顶起来 ,我想会有个自动取舍在里面吧
[解决办法]
有什么不对吗? 又不会越界

[解决办法]
用strncpy的目的就是为了不能越界写,不管你的source有多长,只往dest中放10个字符,至于到不到字串结尾不是它考虑的.

当然你写为这样更好,无论如何dest有正确的结束符:
char dest[10] = 0;
strncpy(dest, source, sizeof(dest) - 1);

.
[解决办法]
没有看过strncpy的源码,也许它把dest[size-1]的地方置0了呢,那么
strncpy(dest, source, sizeof(dest)); 也是总能得到有结束符的字串的.

[解决办法]
多数人都不用str***的,直接用mem***多好。
[解决办法]
不同平台的实现不一样,可能strncpy没结束.
[解决办法]
The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. If count is greater than the length of strSource, the destination string is padded with null characters up to length count. The behavior of strncpy is undefined if the source and destination strings overlap.
[解决办法]
没有严格的对错之分

[解决办法]
lz用的是什么编译器,char dest[10] = 0; 能通过编译?
[解决办法]
本人觉得这样更好
strncpy(dest, source, (sizeof(dest) - 1));

[解决办法]
strncpy(dest, source, 10);
写成
int len = strlen(source);
memcpy(dest, source, len <= 10 ? len : 10);
[解决办法]
既然不对那就改呗。
既然有了String就尽量少用标准C函数。
[解决办法]
关键在于理解函数的行为
strncpy的目的是为了控制copy越界,这个目的作为函数的行为之一,它已经达到了,且效果很好,这就已经足够了

至于其他的,比如说如下的语句
char sz[4]={0};
const char* p="0123456789";
strncpy(sz,p,4);
printf(sz);
在这里,strncpy函数只对4char内存负责,超出4之外便跟其无关了(跟程序的执行环境相关)。所以printf的结果也就千奇百怪了

觉得没什么好讨论的
[解决办法]
to 18楼:
那你改用C吧,不要用C++了。
如果用得好,用标准的string或vector<char>可以达到与strcpy/memcpy相当的性能,甚至更好,而且易用,又不容易出错,何乐而不为呢?
[解决办法]
mingw结果是012300@
vc8结果是0123`
bcc结果0123?
证明,写法是错误的,该减去一位

--------------------------

没必要,结束符是输出时用的,如果是对很长的字串进行某些处理,每次只要处理一部分,完全没必要加结束标志,只要自己记得目标空间的大小,正确处理就行了。加了结束符反而累赘。

读书人网 >C++

热点推荐