c-strncpy介绍了一个有趣的角色



当我在机器上运行一些代码时,它的行为就像我期望的那样。

当我把它放在同事身上时,它表现得很糟糕。事情就是这样。

我有一个值为的字符串:

croc_data_0001.idx

当我对提供18作为长度的字符串执行strncpy时,我复制的字符串的值为:

croc_data_0001.idx♂

如果我做以下

myCopiedString[18]='';
puts (myCopiedString);

则复制字符串的值为:

croc_data_0001.idx

是什么原因导致了这个问题?为什么通过将最后一个字符设置为来解决这个问题?

根据http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

char * strncpy ( char * destination, const char * source, size_t num );
Copy characters from string

将源的前num个字符复制到目标。如果结束源C字符串(由空字符发出信号)的在复制num个字符之前找到,填充目标使用零,直到总共写入了num个字符。没有null字符隐式附加到目的地的末尾,因此只有当长度为源中C字符串的数量小于num.

因此,您需要使用"\0"手动终止目的地。

strncpy不希望复制字符串的大小,而是希望复制目标缓冲区的大小。

在您的情况下,目标缓冲区1太短,禁用strncpy以零终止字符串。因此,字符串后面的所有内容。位置18并且非零的字符串将被视为属于该字符串。

通常情况下,采用缓冲区大小的函数是用这个来调用的,即

char dest[50];
strncpy(dest, "croc_data_0001.idx", sizeof dest);

有了这个和一个额外的

dest[sizeof dest - 1] = '';

字符串将始终以0结尾。

我认为C标准比其他人发布的链接更清楚地描述了这个函数。

ISO 9899:2011

7.24.2.4 strncpy函数

char *strncpy (char * restrict s1,
               const char * restrict s2,
               size_t n);

strncpy函数复制的字符不超过n个(null后面的字符不复制字符)从s2指向的数组复制到s1指向的数组。如果复制发生在重叠的对象之间,则行为未定义。

如果s2指向的数组是一个短于n个字符的字符串,则为null字符被附加到s1指向的数组中的副本,直到总共n个字符被书面的

myCopiedString变量分配了多少空间?如果它大于源字符串的长度,请确保使用bzero清除目标变量。

strncpy并不总是添加.请参阅http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

因此,要么事先清除目标缓冲区,要么始终自己添加,或者使用strcpy

如果问题是:"为什么我的机器上未初始化的内存与另一台机器上的内存有不同的内容",那么,人们只能猜测。

编辑更改了一些措辞;请参阅评论。

相关内容

  • 没有找到相关文章

最新更新