首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的strncpy响应

奇怪的strncpy响应
EN

Stack Overflow用户
提问于 2015-12-29 21:47:29
回答 3查看 455关注 0票数 2

我只是运行这段代码,我从n=1得到的并不是我期望得到的。你能解释一下为什么会发生这种事吗?

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXRIGA 11
int main()
{
    char s[MAXRIGA+2];
    char a[MAXRIGA]="pippo";
    strncpy(s, a, 1); //       n=1
    printf("%s", s);
    return 0;
}

返回

代码语言:javascript
运行
复制
pF

相反,如果n=2或更多,我得到了我想要的。

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXRIGA 11
int main()
{
    char s[MAXRIGA+2];
    char a[MAXRIGA]="pippo";
    strncpy(s, a, 2); //       n=2
    printf("%s", s);
    return 0;
}

返回

代码语言:javascript
运行
复制
pi
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-29 21:51:07

来自man strncpy

除了最多复制src的n字节之外,strncpy()函数也是类似的。警告:如果src的前n个字节中没有空字节,则放置在dest中的字符串不会以空终止。

您只从源字符串复制一个字节,该字符串不是空终止符.所以这里有一个未定义的行为,就是试图打印一个不终止的字符串。n=2也是如此,这似乎是偶然的。

票数 9
EN

Stack Overflow用户

发布于 2015-12-29 21:53:42

strncpy不将空终止符追加到字符串中。您需要在使用strncpy之后手动添加它。

如下所示:

代码语言:javascript
运行
复制
strncpy(s, a, 1); //       n=1
s[1]=0;
printf("%s", s);

F(来自pF)就是任何任意字符,这些字符恰好驻留在找到任何空终止符之前遇到的内存中的位置。严格地说,您的代码应该会产生缓冲区溢出错误,或者访问冲突错误。

在使用strncpy之后添加空终止符,您的问题就会消失:)

票数 5
EN

Stack Overflow用户

发布于 2015-12-29 21:54:09

由于没有初始化数组s,所以它包含随机值。C中的字符串以空字符结束,因此当您用"pippo“初始化数组a时,它包含的值如下:

代码语言:javascript
运行
复制
offset | 0 | 1 | 2 | 3 | 4 |  5 |
value  | p | i | p | p | o | \0 |

当您调用printf时,它需要决定字符串的结尾位置,并通过打印字符来实现这一点,直到到达终止NULL为止。如果s包含随机数据,并且只复制单个字符,那么printf将打印字符串,直到字符串到达一个恰巧为NULL的字节为止。在这种情况下,看起来随机数据的第三个字节是\0,所以printf会打印字符到那个位置。

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

https://stackoverflow.com/questions/34519590

复制
相关文章

相似问题

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