我只是运行这个代码,我得到的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
,似乎是偶然的.
来自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);
F(来自pF)只是任何任意字符,它仍然位于在找到任何空终止符之前遇到的内存中的位置.严格来说,您的代码应该产生缓冲区溢出错误或访问冲突错误.
使用后添加null终止符strncpy
,你的问题就会消失:)