关于C/C++中gets_s()函数只运行一次,第二次跳过的问题解决方案

   今天距离考研还剩55天,在写编程题的时候遇到了一个问题就是gets_s()只运行一次,第二次直接跳过了,并且被赋值了一段乱码。
   查了一下书只解释了gets_s()函数输入后会返回接受字符串存储的地址,尝试接受返回值后并没有解决问题。后来百度发现,gets_s()函数在输入时遇到‘\0’就截止输入,而回车键在ASCLL码中就是‘\0’表示。因此程序在遇到‘\0’时截止输入,但是此时的‘\0’作为一个字符保留在堆栈中等待下一次接收。因此当遇到下一次get系列的接受函数时就会自动接收并且认为读取完毕停止接受。因此我们在使用get系列的函数时一般使用getchar()函数与之配合使用将没有被接收的‘\0’吸收掉。
   展示代码如下:
getchar();
//getchar()用于吸收上一个gets_s输入时最后输入的回车,不加则会将回车赋值给当前值
gets_s(p2->name);

这样每次调用gets_s()时就会将上一次的回车符吸收掉。但是这样写法的缺点是在循环中,若是本程序第一次运行gets_s(),将会需要先敲一下回车才能继续执行。
读到这里可能笔者会想为何不调换一下顺序,代码如下:

gets_s(p2->name);
getchar();
//getchar()用于吸收上一个gets_s输入时最后输入的回车,不加则会将回车赋值给当前值

笔者测试过之后发现当运行是将提示buffer太短导致报错,可能用于运行速度太快了导致的,可以尝试在两句话之间加一些其他延时代码做缓冲。笔者在此没有深究,读者若有好的完善方案可在评论区留下方案分享一下。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值