我在这里把scanf()格式化输入的内部过程给大家尽量细腻地描述一下,希望对初学者有帮助:
scanf()无论内部的格式符是什么,也无论有几个格式符(就是所谓的"%某"),对于每个格式符,都按如下过程进行:
其实现将从键盘输入的数据赋值给参数所指向的空间,而解释方式取决于格式符。
如果一开始输入的是空格字符或者\t或者\n,这三种字符都会被“忽略”,scanf()将不理睬这些字符,但会将这些字符从键盘缓冲区清除掉;
直到输入非空格字符(上面所述的3种符号),scanf()会认为“数据开始了”,并将其暂存起来,而且将其从键盘缓冲区中清除掉;
当再次遇到空格字符,scanf()将认为“当前的数据输入完成”了,而且要命的是:scanf()会将这个空格字符“回退”到键盘缓冲区中。
以上就完成了一次格式符数据的输入过程,同样的过程会在下个格式符中重复!
如果在scanf()后执行gets()函数,那么,scanf()所接受的最后一个\n,必然是\n,会被gets()函数直接接受,而完成字符串的输入!
这就是最要命的地方!
建议在gets()前用“清空键盘缓冲区”的函数(比如flush())先清空scanf()所遗留的\n字符。