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

问题描述:输入用例中有字符型后面换行,然后用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。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
getcharscanf都是C语言中用于从标准输入中获取字符的函数。 使用scanf函数读取字符时,可以使用格式化字符串"%c"来指定输入的字符类型。例如,scanf("%c", &a)将读取一个字符并将其存储到变量a中。需要注意的是,scanf在读取字符后换行符留在输入缓冲区中,这可能导致后续的输入操作出现问题。 而getchar函数则直接从标准输入中读取一个字符,并返回读取到的字符。它不需要格式化字符串,也不换行符留在输入缓冲区中。因此,getchar函数更适合用于读取单个字符。 在使用getchar函数时,我们通常需要使用一个额外的getchar函数来读取输入缓冲区中的换行符。这是因为在前一个输入操作之后,输入缓冲区中可能仍然存在一个换行符。如果不读取它,那么后续的getchar函数可能直接读取到这个换行符,而不是我们期望的字符。 总结起来,scanf函数可以读取指定类型的字符,并且需要注意处理输入缓冲区中的换行符。而getchar函数则更简单直接,适用于读取单个字符。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C语言 字符输入 scanfgetchar的区别](https://blog.csdn.net/weixin_73832459/article/details/127747670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值