gets()函数的离奇之处

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 语言不久,能力有限,不能理解这里的现象,故大胆的对其命名为离奇之处,若得到哪位大神的光顾,对博主略微指点一二,博主将感激不尽。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值