C语言gets函数会覆盖原内容吗

# include
main()

{
char a[20],b[]="The sky is blue.";int i;
for(i=0;i<10;i++) scanf("%c",&a[i]);
a[i]=0;
gets(b);
printf("%s%s\n",a,b);
}
/*
1.程序运行结果为:
Fig flower is red.
Fig flower is red.
*/
====C语言gets函数会覆盖原内容吗?原b[]="The sky is blue.";中有16个字符,gets(b)---输入了“ is red.”8个字符,剩下8个字符空间为何不保留原字符数组中的内容呢?求大侠指教

你在printf改为printf("%s,%s,%d\n",a,b,sizeof(b));这个区测试就会看到 b[]的大小是17(包括结束符)。gets函数是从读入一行字符(换行结束)的函数。gets(b)
的时候把b数组中的前面的字符给覆盖掉了,并在后面自动加了一个结束符,所以输出的结果是这样的。
gets(b)以前 的存储数据是:The sky is blue.结束符
gets(b)后 的存储数据是: is red.结束符 is blue.结束符

你可以在用for输出整个b数组的字符如:
for(i=0;i<16;i++)
printf("%c\n",b[i]);

原b[]="The sky is blue.";中有16个字符,gets(b)---输入了“ is red.”8个字符,还要加一个字符串结束符 NULL。
所以,剩下7个字符空间保留原字符数组中的内容呢,但你通过 b 无论查看到,因为字符串结束 NULL 存在的原因。
你可以直接查看内存,就可以看到你想要的结果。

请进一步查看 gets的实现代码。

关键还是看结束字符‘\0’b中字符最后一位是结束字符,gets(b) 输入数据后 换行后 系统自动在输入字符后加上‘\0’

我是这样理解的