关于PAT中用getchar()与scanf("\n")吸收换行问题

问题描述:输入用例中有字符型后面换行,然后用scanf("\n")吸收未过(图1),用getchar()吸收就AC(图2)。上图代码均对应PAT1067(具体代码及详情描述)在PAT1078中也遇见同类问题。
关于PAT中用getchar()与scanf("\n")吸收换行问题
图1 用scanf("\n") 测试点2未过
关于PAT中用getchar()与scanf("\n")吸收换行问题
图2 用getchar()测点2过

起初一直都未理解这种情况究竟是为什么,难不成是scanf与getchar在读入字符时存在某种区别。今天又再次遇到,查阅后发现,其实不然。在解决这个问题前,先了解一下回车与换行的区别(之前一直以为二者可以等同,根本不是,这是两个概念)
在ASCII码中 回车‘\r’值是13,换行\n是10。
回车\r: 将光标移至当前行首,然后进行逐一覆盖输出,如下图标黄部分
换行\n:将光标移至下一行首,然后输出
回车换行\r\n:与换行一样,将光标移至下一行首输出
关于PAT中用getchar()与scanf("\n")吸收换行问题
而在windows下,当键盘敲击回车键(enter)时产生\r\n,但操作系统内核把从键盘驱动器中读到字符发送给流的缓冲区时,将自动转换成\n;同理,反向,当向控制台输出\n时将自动转换为\r\n。
参考博客:请点击
这就意味着,在测试程序中,换行符\n,并不是真的就是\n,所以用scanf("\n");来吸收匹配不到。当定义一个char型c,用其吸收就可以(scanf("%c",&c);)如图所示
关于PAT中用getchar()与scanf("\n")吸收换行问题
当然尽管这样解释貌似可信,但仍存在问题
1 scanf("\r\n")同样错误。然按照上述流自动转换了换行符,这样不应有错才对
总之,这说明了一个问题,并非getchar与scanf的问题,而是换行符的问题。应该是当敲击回车键后,流将其转换了成了某种字符(\r\n),所以不应该有scanf("\n")来匹配。用getchar()或者scanf("%c",&c)都可,但就是不能限定这个字符是\n。