首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strncpy文档问题

strncpy文档问题
EN

Stack Overflow用户
提问于 2011-01-22 14:08:39
回答 6查看 953关注 0票数 6

在关于strncpyhttp://www.cplusplus.com/reference/clibrary/cstring/strncpy/的以下部分中,它提到了以下内容:

没有空字符被隐式地追加到目的地的末尾,因此只有当源中的C字符串长度小于num时,才会以空终止。

这句话是什么意思?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-01-22 14:13:23

这意味着,例如,如果源字符串是20个字符加上一个空终止符,并且strncpy指定的字符少于21个,那么目标字符串将不会追加一个空字符。

这是因为它的工作方式:strncpy保证它将精确地写入N个字节,其中N是传入的长度值。

如果源字符串(sans空字节)的长度小于该长度,它将使用空值填充目标区域。如果它等于或更大,则不会向目标添加空值。

这意味着它在技术上可能不是你得到的C字符串。这可以通过如下代码来解决:

代码语言:javascript
运行
复制
char d[11];          // Have enough room for string and null.
strncpy (d, s, 10);  // Copy up to 10 bytes of string, null the rest.
d[10] = '\0';        // Then append null manually in case s was too long.

分配11个字节(数组索引0.. 10),最多复制10 (索引0.9),然后将第11字节(索引10)设置为null。

下面是一个图表,显示了用strncpy (d, s, 10)将各种大小的字符串写入10个字符区域的三种可能性,其中.表示空字节:

代码语言:javascript
运行
复制
s              d
-------------  ----------
Hello.         Hello.....
Hello Fred.    Hello Fred
Hello George.  Hello Geor

请注意,在第二和第三种情况下,不会写入空字节,因此,如果将d视为字符串,则可能会对结果感到失望。

票数 13
EN

Stack Overflow用户

发布于 2011-01-22 14:12:31

字符串"foo"有3个字符+1个空终止符(以"foo\0"的形式存储),总长度为4。如果使用n=3 (或更少)调用strncpy,它不会在目标字符串的末尾追加空终止符,而是只复制"foo"。由于缺少指示字符串结束的null终止符,试图打印结果字符串将导致未定义的行为。

您必须非常小心,或者传递大于最大源的n,或者自己添加空终止符。

票数 5
EN

Stack Overflow用户

发布于 2011-01-22 14:11:57

这意味着它复制源字符串的终止空,但如果源字符串不适合目标,则不添加终止空。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4768271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档