gets()函数的离奇之处
无限输入
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[3];
gets(a);
puts(a);
return 0;
}
图零
虽然数组a只能储存3个元素,但gets()并不领情,尴尬。
C Prime Plus中 这样描述:单独使用gets()函数时,它无法检测出数组是否装得下输入行,因为数组名被转换成该数组元素的首地址,导致,gets()函数只知道数组的开始处,并不知道数组中有多少个元素。
不仅危险至极,而且在特殊情况下并好用
于是有了fgets(),gets_s()函数,其用法和过程,大家可以在书中查阅
但是今天博主发现的离奇之处,是书本未曾提及的
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[3];
char *p;
gets(a);
p=a;
puts(p);
return 0;
}
图一
图二
图三
图四
图五
上面五幅图,清晰地反映出了问题
一.(图零,图一,图二对比)调用gets()函数输入后,用指针指向数组,这时不论是用指针还是用数组名做puts()函数的实参,输出元素个数为初始化数组时的大小。为什么会出现这种情况?
博主个人见解:C Prime Plus中解释道,由于gets()函数会一直读取当前行的字符,当超出数组大小后,多余字符将继续储存在内存中,但这里的地址就是未知的了,如果是尚未使用的,影响不大,但如果地址上本来是数据,他会擦拭掉原有数据进行储存,问题非常大。回到博主的问题上,数组的大小和地址一开始就分配好了,用gets()对数组进行输入有,使数组a与其他地址产生了某种联系,这时用p指向a,仿佛像敲了一下a的脑袋一样,认清了自己是谁,于是断开了这种联系。由于‘0’在行尾,所以数组中的元素全是字符,导致输出了等于数组大小的元素个数 。
二.(图一,图三,图四对比)在调用gets()前用指针指向数组,输出时依旧没考虑数组的大小问题,整行输出,如果用指针指向的地址作为puts()函数的实参时,函数不能正常输出,这又是为什么了?
三.(图四 图五对比)当一行里元素个数小于数组大小时,用指针p做puts()函数的实参,输出没有问题,真的是巧了
由于博主刚自学C 语言不久,能力有限,不能理解这里的现象,故大胆的对其命名为离奇之处,若得到哪位大神的光顾,对博主略微指点一二,博主将感激不尽。