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

探讨在C语言编程中,使用scanf( )与getchar()处理输入流中换行符的不同效果,解析回车与换行的区别及其在Windows系统下的自动转换机制。

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

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值