当前位置:  开发笔记 > 编程语言 > 正文

奇怪的strncpy响应

如何解决《奇怪的strncpy响应》经验,为你挑选了2个好方法。

我只是运行这个代码,我得到的n = 1不是我期望得到的.你能解释一下为什么会这样吗?

#include 
#include 
#include 
#define MAXRIGA 11
int main()
{
    char s[MAXRIGA+2];
    char a[MAXRIGA]="pippo";
    strncpy(s, a, 1); //       n=1
    printf("%s", s);
    return 0;
}

回报

pF

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

#include 
#include 
#include 
#define MAXRIGA 11
int main()
{
    char s[MAXRIGA+2];
    char a[MAXRIGA]="pippo";
    strncpy(s, a, 2); //       n=2
    printf("%s", s);
    return 0;
}

回报

pi

Eugene Sh... 9

来自man strncpy:

strncpy()函数类似,只是复制了最多n个字节的src.警告:如果src的前n个字节中没有空字节,则dest中的字符串将不会以空值终止.

您只复制源字符串中的一个字节,该字符串不是空终止符.所以你在这里得到一个未定义的行为,因为尝试打印一个非终止字符串.同样的n=2,似乎是偶然的.



1> Eugene Sh...:

来自man strncpy:

strncpy()函数类似,只是复制了最多n个字节的src.警告:如果src的前n个字节中没有空字节,则dest中的字符串将不会以空值终止.

您只复制源字符串中的一个字节,该字符串不是空终止符.所以你在这里得到一个未定义的行为,因为尝试打印一个非终止字符串.同样的n=2,似乎是偶然的.



2> Grantly..:

strncpy不会将null终止符附加到字符串上.您需要在使用后手动添加它strncpy.

像这样:

strncpy(s, a, 1); //       n=1
s[1]=0;
printf("%s", s);

F(来自pF)只是任何任意字符,它仍然位于在找到任何空终止符之前遇到的内存中的位置.严格来说,您的代码应该产生缓冲区溢出错误或访问冲突错误.

使用后添加null终止符strncpy,你的问题就会消失:)


@EugeneSh.实际上,如果有空间,它**是**将空字节一直附加到目标缓冲区的末尾!这是一个专门的功能,不应该成为标准.
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有