今天距离考研还剩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太短导致报错,可能用于运行速度太快了导致的,可以尝试在两句话之间加一些其他延时代码做缓冲。笔者在此没有深究,读者若有好的完善方案可在评论区留下方案分享一下。