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)
来自man strncpy:
strncpy()函数类似,只是复制了最多n个字节的src.警告:如果src的前n个字节中没有空字节,则dest中的字符串将不会以空值终止.
您只复制源字符串中的一个字节,该字符串不是空终止符.所以你在这里得到一个未定义的行为,因为尝试打印一个非终止字符串.同样的n=2,似乎是偶然的.
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,你的问题就会消失:)