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

gerry2000 2007-10-14 03:39:03
我经常看到一些朋友写代码时strncpy函数是这么用的。

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

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

虽然很简单,但我就想不通, 是多心了, 还是这些老手还不能算传说中的高手?
...全文
593 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
laowang2 2008-11-19
  • 打赏
  • 举报
回复
用memcpy更好一点吧
Athos_K 2008-07-13
  • 打赏
  • 举报
回复
搂住的写法很好,刚在一本书中发现是这样写的
char dest[10] = 0;
strncpy(dest, source, sizeof(dest));
dest[sizeof(dest)-1]='\0';
显然楼住写法更好
Athos_K 2008-07-13
  • 打赏
  • 举报
回复
strncpy



原型:extern char *strncpy(char *dest, char *src, int n);

用法:#include <string.h>

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。

说明:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。



linking3000 2007-10-16
  • 打赏
  • 举报
回复
这个没有必要吧
一般情况下会加上 dest[9]='\0';
yafizyh 2007-10-15
  • 打赏
  • 举报
回复
mingw结果是012300@
vc8结果是0123`
bcc结果0123?
证明,写法是错误的,该减去一位

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

没必要,结束符是输出时用的,如果是对很长的字串进行某些处理,每次只要处理一部分,完全没必要加结束标志,只要自己记得目标空间的大小,正确处理就行了。加了结束符反而累赘。
AdriftLeaves 2007-10-15
  • 打赏
  • 举报
回复
to 18楼:
那你改用C吧,不要用C++了。
如果用得好,用标准的string或vector<char>可以达到与strcpy/memcpy相当的性能,甚至更好,而且易用,又不容易出错,何乐而不为呢?
Faitle 2007-10-15
  • 打赏
  • 举报
回复
关键在于理解函数的行为
strncpy的目的是为了控制copy越界,这个目的作为函数的行为之一,它已经达到了,且效果很好,这就已经足够了

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

觉得没什么好讨论的
kingwkb 2007-10-15
  • 打赏
  • 举报
回复
既然有了String就尽量少用标准C函数

怎么能这么多,我是一直都是用C函数,很少用string的,我觉得C函数效率高
BluntBlade 2007-10-15
  • 打赏
  • 举报
回复
既然不对那就改呗。
既然有了String就尽量少用标准C函数。
xiantongyuan 2007-10-15
  • 打赏
  • 举报
回复
这样写更好了
mx81831 2007-10-15
  • 打赏
  • 举报
回复
猩猩的答案都是正确的,小裤衩只能在这里接分了。
SoftBomb 2007-10-15
  • 打赏
  • 举报
回复
strncpy(dest, source, 10);
写成
int len = strlen(source);
memcpy(dest, source, len <= 10 ? len : 10);
王二牛放犇 2007-10-15
  • 打赏
  • 举报
回复
本人觉得这样更好
strncpy(dest, source, (sizeof(dest) - 1));
xlstc7 2007-10-15
  • 打赏
  • 举报
回复
lz用的是什么编译器,char dest[10] = 0; 能通过编译?
gerry2000 2007-10-14
  • 打赏
  • 举报
回复
好与更好的区别, 用strcpy的都很多啊。
飞哥 2007-10-14
  • 打赏
  • 举报
回复
没有严格的对错之分
weiym 2007-10-14
  • 打赏
  • 举报
回复
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.
  • 打赏
  • 举报
回复

#include<stdio.h>
#include<string.h>

int main()
{
char sz[4]={0};
const char* p="0123456789";
strncpy(sz,p,4);
printf(sz);
}

mingw结果是012300@
vc8结果是0123`
bcc结果0123?
证明,写法是错误的,该减去一位
  • 打赏
  • 举报
回复
不同平台的实现不一样,可能strncpy没结束.
alextooter 2007-10-14
  • 打赏
  • 举报
回复
多数人都不用str***的,直接用mem***多好。
加载更多回复(5)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧