scanf和gets的区别

关于scanf和gets函数
scanf不能接收回车、空格或者TAB,但是gets可以读入空格,输入分隔符只有回车
此外,两者对于缓冲区里的回车符的方式也是不同的。scanf在读取非空白符之前会忽略回车符(例如在输入前一直按回车,这时候的回车是被忽略的),读取之后遇到空白字符(空格、回车、TAB)会停止输入,将回车符留在缓冲区;gets只要一遇到回车就输入结束,并把回车从缓冲区里面移走。

示例1:
在这里插入图片描述
根据示例,可以看出直接跳过gets,最后打印可以看出gets里的a是个空白符。
因为前面scanf接收输入时,最后是以回车结束输出的,但是回车符还是保存在缓冲区中,即当时缓冲区中只有一个回车符,gets来缓冲区读数据时(键盘输入的数据都是在缓冲区)遇到回车符就停止输入,并把回车符从缓冲区移走,所以下一个是可以正常输入。

示例2
在这里插入图片描述
在这里插入图片描述
第一行是输入(hello world !),scanf遇到空白符后就停止输入,接下来输入的都保存在缓冲区中,所以第二行printf出的只有空白符之前的,即(hello)。后面的都用gets接收(后面是没有从键盘输入的,都是读取的缓冲区的内容)。

但是gets使用时会报警告,因为没有规定缓冲区大小,有越界危险。现在有更安全的函数,gets_s(str, Buffer),规定了缓冲区大小(第二个参数)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值