声明:char buf[5];
则元素为 a[0] a[1] a[2] a[3] a[4]
a[5]不属于buf数组 该数组可以最多存放a[0] a[1] a[2] a[3] 这4个字符, 而因为字符数组的第5个a[4]字符用于/0
#include
#include
#include
int main()
{
char str[5];
char c='d';
strcpy(str,"hello");
//string copy (include '/0')
printf("d:%d c:%c str:%s /n", c,c, str );
if(c == '/0')
printf("c == '//0' /n");
else
printf("c != '//0' /n");
return 0;
}
[root@localhost cpp]# ./a
d:0c:str:hello
c == '/0'//可见strcpy把str[5]也就是char c的内存空间填入了/0
正确的做法是
[root@localhost cpp]# cat a.c
#include
#include
#include
int main()
{
char str[5];
char c='d';
strncpy(str,"hello",sizeof(str)-1);
//str copy (不包含'/0', 也就是到达源串尾也不自动添加/0)
//
str[4]='/0';
printf("d:%d c:%c str:%s /n", c,c, str );
if(c == '/0')
printf("c == '//0' /n");
else
printf("c != '//0' /n");
return 0;
}
[root@localhost cpp]# ./a
d:100c:dstr:hell
c != '/0'
不加str[x]='/0'
[root@localhost cpp]# cat a.c
#include
#include
#include
int main()
{
char str[6];
char c='d';
strncpy(str,"hello",sizeof(str)-1);
//str copy ( '/0')
//
//str[5]='/0';
不添加/0会引起下面的乱码错误, 随后的变量c的内容也未可预料
printf("d:%d c:%c str:%s /n", c,c, str );
if(c == '/0')
printf("c == '//0' /n");
else
printf("c != '//0' /n");
return 0;
}
[root@localhost cpp]# ./a
d:100 c:d str:helloSd0瓯繄瓯?jO狘SO堦笨,jO
c != '/0'; ;;;;;;;;;;;;;;;总结;;;;;;;;; 使用 strcnpy函数时正确做法: char array[80];
const char *src = "https://www.it610.com/article/sdjfksdfjksdf";
;
;
;
;
第一种方式 strcnpy(array, src, sizeof(array));
array[sizeof(array) - 1] = '/0';
// 为避免 src 长度超过80(包括'/0') 时array数组末尾没有加‘/0’.导致缓冲区溢出。 ;;;;;;;;;第二种方式;;;;;;;; memset(array, 0, sizeof(array));
strncpy(array, src, sizeof(array) -1);
// 这样,由于memset 把 array 添0,所以保证array[sizeof(array) -1] = '/0';
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
当src 长度小于80 时 没有问题。注意,strncpy()不会自动添加 '/0';
除非 你能保证 src的长度不会超过array的长度,这时可以直接用 strcpy(array, src);
【C/C++数组边界与赋值】
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析