```c
#include <stdio.h>
#include <string.h>
int main()
{
char flag = '0';
char buf[4];
memset(buf,0,4);
char str[10] = "0123";
strcpy(buf,str);
//strncpy(buf,str,sizeof(buf));
//strncpy_s(buf,sizeof(buf),str,sizeof(buf));
if(0 == strcmp("123",buf))
{
flag = '1';
}
if(flag == '0')
printf("!=\n");
else if(flag == '1')
printf("==\n");
else
{
printf("shadow\n");
//'\0'的ASCII 为0 ,若打印%c,没有输出
if(flag == 0)
printf("flag:\\0\n");
else
printf("flag:%c\n",flag);
}
printf("buf: %s\n",buf);
if(buf[0] == 0)
printf("buf[0]:\\0\n");
else
{
for(int i = 0;i<sizeof (buf); i++)
printf("buf[%d]: %c\n",i,buf[i]);
}
return 0;
}
/*
修改str变量值,对应的输出结果
strcpy
char str[10] = "123" == buf:123 flag:1 buf[0]:0 buf[3]:\0
char str[10] = "012" != buf:012 flag:0 buf[0]:0 buf[3]:\0
char str[10] = "0123" shadow buf:0123 flag:\0 buf[0]:0 buf[3]:3
char str[10] = "01234" shadow buf:01234 flag: 4 buf[0]:0 buf[3]:3
strncpy
char str[10] = "123" == buf:123 flag:1 buf[0]:0 buf[3]:\0
char str[10] = "012" != buf:012 flag:0 buf[0]:0 buf[3]:\0
char str[10] = "0123" != buf:0123? flag:0 buf[0]:0 buf[3]:3
strncpy_s
char str[10] = "123" == buf:123 flag:1 buf[0]:0 buf[3]:\0
char str[10] = "012" != buf:012 flag:0 buf[0]:0 buf[3]:\0
char str[10] = "0123" != buf: flag:0 buf[0]:\0
strcpy:
当sizeof(buf)<sizeof(str), 发生内存溢出,溢出的内容赋值给变量flag,flag值修改,造成程序未知错误,同时buf数组末尾不会自动追加\0
strncpy:
当sizeof(buf)<sizeof(str),拷贝时buf遇到\0停止,并且buf数组末尾不会自动追加\0
strncpy_s:
当sizeof(buf<sizeof(str),buf拷贝'0',即buf为空串
*/
`