C中关于数组长度影响strncpy结果的问题,求教

今天刚刚学习字符串数组,运行过程中发现数组的长度会影响输出的结果
在长度为16及以下时候,一切正常

 #include <stdio.h>
#include <string.h>
int main() 
{ 
    char s[16],l[16];
    gets(s);
    puts(s);
    strncpy(l,s,3);
    strcat(l,s);
    puts(l);
 } 

图片说明

长度改为17及以上以后,问题出现了,strncpy函数的结果很奇怪

 #include <stdio.h>
#include <string.h>
int main() 
{ 
    char s[17],l[17];
    gets(s);
    puts(s);
    strncpy(l,s,3);
    strcat(l,s);
    puts(l);
 } 

图片说明

求教
1.是什么导致了以16为节点的这种不同?
2.当数组长度到17及以上时候,在strncpy的结果中
出现了一个'-'符号,是怎么回事?

小弟在此谢过了!

先把数组清空了试试,memset等,然后再strncpy

strcat 返回到减号。。。

这个跟长度没有关系,具体是编译环境的问题dev c++内部编译环境有时不稳定,才会出现这种情况。数组的长度是在初始化的时候定义的,是多少多可以,如果实际输入的比定义的长度大,那就只储存长度大小的字符。所以,并没有16,17的关系