我只是运行此代码,我得到的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;
}
返回
pF
相反,如果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;
}
返回
pi
答案 0 :(得分:9)
来自man strncpy
:
strncpy()函数类似,除了src的最多n个字节 被复制。警告:如果前n个字节中没有空字节 对于src,放在dest中的字符串不会以空值终止。
您只复制源字符串中的一个字节,这不是空终止符。所以你在这里得到一个未定义的行为,因为尝试打印一个非终止字符串。 n=2
也是如此,其中出现意外工作。
答案 1 :(得分:5)
strncpy
不会将null终止符附加到字符串上。您需要在使用strncpy
后手动添加它。
像这样:
strncpy(s, a, 1); // n=1
s[1]=0;
printf("%s", s);
F(来自pF)只是在找到任何空终止符之前仍然遇到驻留在内存中的位置的任意字符。严格来说,您的代码应该产生缓冲区溢出错误或访问冲突错误。
使用strncpy
后添加空终止符,您的问题将消失:)
答案 2 :(得分:3)
由于您没有初始化数组s
,因此它包含随机值。 C中的字符串以NULL字符终止,因此当您使用&#34; pippo&#34;初始化数组a
时它包含的值是:
offset | 0 | 1 | 2 | 3 | 4 | 5 |
value | p | i | p | p | o | \0 |
当你调用printf
时,它需要决定字符串结尾的位置,并通过打印字符直到它到达终止NULL为止。如果s
包含随机数据而您只复制一个字符,那么printf
将打印该字符串,直到它到达一个恰好为NULL的字节。在这种情况下,它看起来像随机数据的第3个字节是\ 0所以printf打印字符到那一点。