有危险的gets()函数

gets函数介绍:

函数原型:char *gets(char *s);
需要的头文件:#include <stdio.h>
函数功能:从标准输入读入字符,并保存到s指定的内存空间, 直到出现换行符或读到文件结尾为止。
参数:s:字符串首地址
返回值: 成功:读入的字符串 失败:NULL

gets(str)与scanf("%s",str)的区别:

  1. gets(str)允许输入的字符串有空格,scanf("%s",str)不允许含有空格
  2. scanf碰到缓冲区里面的空字符(空格,tab,回车,换行就会截断并添加\0),而gets是要等回车才截断字符串并添加\0的

注意事项:

由于scanf()和gets()无法知道字符串s大小,必须遇到换行符或读到文件结尾为止才接收输入,因此容易导致字符数组越界(缓存区溢出)的情况

程序代码:

#include <stdio.h>

int main(void)
{
    char ch1 = 'A';
    char str[5];

    printf("input str:");
    gets(str);

    printf("str=%s\n",str);
    printf("ch1 = %c\n",ch1);
    
    return 0;
}

各种输入操作

正常输入后运行结果:
当输入的字符个数在5个以内时,程序正常输出。
在这里插入图片描述

非正常输入后运行结果:
当连续输入16个数字字符时,程序没有报错,但字符变量ch1的值被改变。这是由于数组越界访问,篡改了其他变量的值。
在这里插入图片描述
暴力输入后运行结果:
当输入一大段字符串时,发生了段错误,在gcc编译器上段错误一般是指非法访问内存空间。
在这里插入图片描述

解决办法:

  1. 使用更安全的fgets()函数。
  2. 定义足够大的数组空间
  3. 提示输入的用户, 比如:
printf("请输入不超过5个字符的字符串:");
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

⁽⁽ଘ晴空万里ଓ⁾⁾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值