当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’这个位置,然后程序进行下一步。
正确的应该为下图: