C语言scanf函数加\n导致缓冲区阻塞问题

 

        当scanf中输入了‘\n’,则会出现缓冲区阻塞问题。缓冲区为空时,scanf会没有读取的内容,因此阻塞。故仍需要再次输入一个符号,才能保证缓冲区中有内容去读取,从而scanf才能运行。但是scanf只会识别前两个,而不会识别第三个输入的内容。   
        在上述题目中,加入‘\n’,会导致在输入5和6之后,缓冲区中为空,scanf无法运行,故还要输入第三个数字,即使输入回车,因为是‘%d’,所以scanf是不会识别的。(scanf在读取整数型、浮点数、字符串,会自动忽略‘\n’和空格符等。忽略指的是scanf函数会在执行时,首先删除这些字符,然后缓冲区为空,再阻塞。而scanf函数识别字符型时,不会忽略任何字符,即输入空格或回车不会阻塞,因为它会识别。)
        同时,scanf中双引号里面是什么,我们再输入的时候就要写什么,他会一个一个进行匹配。故引号里面有三个东西,即%d ,%d,\n,因此我们要输入三个,然后第一个%d赋值给a,第二个%d赋值给b,第三个不识别,因为没有把他赋值给第三个已被定义的变量。故我们先输入5,回车,他将5赋值给a,然后将缓冲区中的回车符删掉(忽略),缓冲区为空,阻塞,等待输入第二个数字。我们继续输入6,然后回车,他将6赋值给b,然后将缓冲区中的回车符删掉(忽略),缓冲区为空,阻塞,等待输入第三个数字。我们再输入随机的一个数字9,他相当于将这个随机数字9赋值给了‘\n’这个位置,然后程序进行下一步。
    正确的应该为下图:

 

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值