关于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),规定了缓冲区大小(第二个参数)。