6.47gets函数的疑问解决方法

<C程序设计试题汇编>6.47gets函数的疑问
代码:
        char   a1[5],a2[5],a3[5],a4[5];
        scanf( "%s%s ",a1,a2);
        gets(a3);gets(a4);
        puts(a1);         puts(a2);
        puts(a3);         puts(a4);

程序运行,输入:aa_bb <CR> (_为空格, <CR> 为回车)
cc_dd <CR>

程序输出:
aa
bb

cc_dd
前面的aa   bb没有问题,可后面的空行和cc_dd什么原因,不明白?
注:程序运行到最后有一个Debug   Error:
Run-Time   Check   Failure   #2   -   Stack   around   the   variable   'a4 '   was   corrupted.
我用的是VS2005

------解决方案--------------------
aa bb后的回车读到a3
cc dd整个串读到a4
------解决方案--------------------
scanf以输入缓冲区内的空白(空格,回车,tab)为结束标记,而gets以回车为结束标记。

用scanf输入后的回车会仍留在缓冲区内,而gets不会。