其实scanf这个函数在程序运行时,不是会停留在那边一会儿嘛,等你去输入一个值,这个时候当你输进去值之后,你做了什么事?,是按个回车,对吧?这个时候其实你就把回车给加了进去,加到了一个叫缓冲区的地方,其实这个时候缓冲区里有你要的变量还有一个回车,当你要再来一次scanf时你其实是在回车后面再加一个变量和回车,当你要printf的时候,其实中间回车,也是会被打印的,并且回车的%d是个很离谱的数字,这就会导致错误,所以需要有一个getchar或是其他的去吸收这个回车,让这个缓冲区里,中间变量之间没有回车
你会问出这样的问题,说明你从来就没有搞清楚scanf到底如何运作的
1.scanf会从输入缓冲区里拿数据,如果输入缓冲区里没有数据,它会阻塞住,等待输入缓冲区里有数据
2.你在控制台里敲字母和数字的时候,并不会立即进入缓冲区,要等你按下回车,那么之前输入的字母数字和回车会一起进入缓冲区(压栈)
3.当使用%d(%ld/%lld)、%f(%lf,%llf)作为操作符时,数据后面遇到空格、换行和非数字符号会自动截断,scanf会取出数字部分赋值给变量,但非数字部分依然驻留在缓冲区内。如果数字之前有空格或换行,会自动跳过(丢弃),而如果数字之前是其它字符,会造成读取错误。
举例:123abc,那么只会得到123,abc依然在缓冲区里,而a123则会出错
4.如果使用的是%c作为操作符,只会一次读取一个字符,换行也占一个字符,如果不另外读取换行,那么数据就会错乱