Question: 在输入输出测试的时候,发现字符类型的输入在其他类型输入之后的系统不给我输入字符的机会。
🐭 有错误勿喷,欢迎各位大佬指正
😱 通过不同类型的输入在字符输入之前进行测试,发现字符的输入都会受到影响,但是将字符输入放在最开始就没有问题了!!!到底是为什么啊啊啊啊啊
❓问题示例❓
🔖在输入字符前输入整型数数据结果
🔖在输入字符前输入字符串数据结果
🔖单独输入字符数据
👻原因分析👻
回归原理去思考,果然给自己想通啦 !!!
详细可参考大佬文章: 什么是缓冲区(buffer),什么是缓存(cache)
缓冲区: 缓冲区是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
这里对应的是行缓冲:当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。
scanf("%d",&interger);
scanf("%c",&zifu);
👩💻 借助这段代码进行分析:
- 运行后首先输入的是整型数据,假设我们输入的是2,这个过程就相当于我们向标准输入缓冲区中写入字符“2\n”。
- 输入回车后,scanf才开始匹配,scanf中的%d匹配整型数值2,放入到interger变量中,此时‘\n’仍然在缓冲区中。
- 此时!!!,下一行碰到的是scanf(“%c”,&zifu);碰到的是读取字符,先理清下面这个概念再往下。
划重点:
当执行scanf读取整型数、浮点数、字符串的时候,会首先删除缓冲区的‘\n’、空格符等字符串,然后在进行阻塞。
但是,执行scanf读取字符的语句时,不会删除任何字符,所以它会读取缓冲区中的’\n’。
4.接着上一步,执行scanf(“%c”,&zifu);读取到了缓冲区中的‘\n’,所以就开始匹配了,但啥也没有啊,然后就产生了上面的问题。鼠鼠我啊此刻顿悟!!🙇♀️