C++中!cin的含义是什么?如何触发cin的非法输入判断分支?
!std::cin含义与非法输入触发规则 #include <iostream> int main() { int total, choice; std::cin >> total >> choice; if (!std::cin) //bad input { std::cout << total << choice; } }
!std::cin的本质
std::cin是标准输入流对象,C++为流对象重载了布尔类型转换运算符与逻辑非运算符:
- 当流处于正常可用状态时,流对象转布尔值的结果为
true,!std::cin运算结果为false,不会进入if分支 - 当流被标记为错误状态时,流对象转布尔值的结果为
false,!std::cin运算结果为true,才会进入错误处理分支
整型读取场景下的合法/非法输入判定
代码中通过>>运算符为两个int类型变量读取输入,该运算符的读取规则为:首先自动跳过开头所有空白字符(空格、换行、制表符均算空白),之后逐字符读取可解析为整数的内容(可选正负号+连续数字字符),遇到第一个非整数字符时停止读取,将读到的内容转换为整型值存入对应变量。
只要读取过程中无法完成合法整数的解析,就会置位流的错误标记(failbit/eofbit/badbit),触发!std::cin为真,常见触发场景有三类:
- 类型不匹配:待读取位置的字符无法组成合法整数,会置位
failbit。比如直接输入字母、标点等非数字内容:输入abc 123时,第一个待读取字符是a,根本无法解析为整数,直接触发错误;如果输入123abc 456,第一个整数123会被成功读入total,接下来读取choice时遇到a,解析失败,同样触发错误。 - 提前读到输入结束标记:还没读够两个整数就碰到了EOF(输入末尾),会置位
eofbit。比如只输入了一个整数就按快捷键发送结束信号:Linux/macOS下按Ctrl+D,Windows下按Ctrl+Z后回车,或者启动程序后直接发送EOF,都会触发错误。 - 底层IO故障:比如标准输入流被意外关闭、输入硬件读写异常,会置位
badbit,这种极端情况也会触发分支。
测试时无法进入分支的原因
之前测试时输入的内容应该都符合两个整数的读取要求,比如输入1 2、100 200这类纯数字加空白分隔的内容,两个变量都读取成功,流始终处于正常状态,自然不会进入错误处理分支。
可以尝试输入非数字内容、或者提前发送EOF,就能稳定触发该分支。注意触发错误时,没有成功读取的变量会保留未初始化的不确定值,直接输出可能得到乱码。
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

