奇怪的strncpy响应

Syn*_*yze 2 c string strcpy strncpy

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

回报

pF
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

回报

pi
Run Code Online (Sandbox Code Playgroud)

Eug*_*Sh. 9

来自man strncpy:

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

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


Gra*_*tly 5

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

像这样:

strncpy(s, a, 1); //       n=1
s[1]=0;
printf("%s", s);
Run Code Online (Sandbox Code Playgroud)

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

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

  • @EugeneSh.实际上,如果有空间,它**是**将空字节一直附加到目标缓冲区的末尾!这是一个专门的功能,不应该成为标准. (2认同)