为何两次std::cin调用仅一次终端输入?代码运行原理咨询
我对自己的代码运行原理存在疑惑:代码中包含两次std::cin调用,但第二次并未在终端开启新行等待输入(我原以为std::cin会这样做),且此前我认为std::cin.get仅用于从字符串中获取信息。我编写的代码旨在提取输入中的第一个值(例如输入"12.4 + 5"时得到value=12.4),代码确实生效,但我不解其中原因,也疑惑为何没有第二次输入提示。
以下是我的代码:
#include <iostream> int main() { char ch; std::cin >> ch; switch(ch) { case '.': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': std::cin.putback(ch); double value; std::cin >> value; std::cout << value << "\n"; default: return 0; } return 0; }
问题解答
为什么第二次
std::cin不需要等待新输入?std::cin的输入依赖输入缓冲区:当你在终端输入内容并按下回车后,所有输入内容都会被存入缓冲区。第一次std::cin >> ch只是从缓冲区读取了第一个字符,剩余内容仍留在缓冲区中。第二次std::cin >> value直接从缓冲区剩余内容里读取浮点数,不需要等待新的输入。比如输入"12.4 + 5",第一次读取了字符'1',putback把它放回缓冲区后,第二次cin >> value会自动读取连续的合法浮点数字符('1'、'2'、'.'、'4'),直到遇到空格或加号这类非浮点数字符为止,全程不需要新输入。关于
std::cin.get的误解std::cin.get并不是只能从字符串获取信息,它的作用是从输入流中读取单个字符——终端输入就是输入流的一种。它和std::cin >> ch的核心区别是:cin >>会自动跳过空格、换行等空白字符,而cin.get会读取包括空白字符在内的所有字符。代码生效的具体逻辑
代码先读取输入的第一个字符:如果是小数点或数字,就通过std::cin.putback(ch)把这个字符放回输入缓冲区,让后续的std::cin >> value可以完整读取整个浮点数(因为cin >> value会识别连续的数字、小数点组成的合法浮点数);如果第一个字符不是数字或小数点,直接进入default分支返回0,程序结束。整个流程利用了输入缓冲区的特性和cin对浮点数的自动解析规则,所以能正确提取输入中的第一个数值。
内容的提问来源于stack exchange,提问作者i_need_help

