我只是运行这段代码,我从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
发布于 2015-12-29 21:51:07
来自man strncpy
除了最多复制src的n字节之外,strncpy()函数也是类似的。警告:如果src的前n个字节中没有空字节,则放置在dest中的字符串不会以空终止。
您只从源字符串复制一个字节,该字符串不是空终止符.所以这里有一个未定义的行为,就是试图打印一个不终止的字符串。n=2
也是如此,这似乎是偶然的。
发布于 2015-12-29 21:53:42
strncpy
不将空终止符追加到字符串中。您需要在使用strncpy
之后手动添加它。
如下所示:
strncpy(s, a, 1); // n=1
s[1]=0;
printf("%s", s);
F(来自pF)就是任何任意字符,这些字符恰好驻留在找到任何空终止符之前遇到的内存中的位置。严格地说,您的代码应该会产生缓冲区溢出错误,或者访问冲突错误。
在使用strncpy
之后添加空终止符,您的问题就会消失:)
发布于 2015-12-29 21:54:09
由于没有初始化数组s
,所以它包含随机值。C中的字符串以空字符结束,因此当您用"pippo“初始化数组a
时,它包含的值如下:
offset | 0 | 1 | 2 | 3 | 4 | 5 |
value | p | i | p | p | o | \0 |
当您调用printf
时,它需要决定字符串的结尾位置,并通过打印字符来实现这一点,直到到达终止NULL为止。如果s
包含随机数据,并且只复制单个字符,那么printf
将打印字符串,直到字符串到达一个恰巧为NULL的字节为止。在这种情况下,看起来随机数据的第三个字节是\0,所以printf会打印字符到那个位置。
https://stackoverflow.com/questions/34519590
复制相似问题