如何处理C++中输入值超出变量存储范围引发的溢出异常?
C++ 输入超出short类型范围的异常预防方案
你遇到的场景核心问题是有符号整数溢出属于C++标准规定的未定义行为,值存入short变量的瞬间就可能触发崩溃,所以不能依赖存储后的变量值做校验。可以用以下两种方案解决:
方案1:先读取到更大范围的整数类型,再做范围校验
这是最稳妥、可精确区分错误类型的方案:先把输入存入取值范围远大于short的int/long long类型,确认值落在short的合法区间后,再转成short使用。
示例代码:
#include <iostream> #include <climits> // 头文件内置short类型上下限定义SHRT_MAX、SHRT_MIN using namespace std; int main() { long long input_val; cin >> input_val; // 存储前先校验范围 if (input_val > SHRT_MAX || input_val < SHRT_MIN) { // 此处写你的溢出异常处理逻辑 cout << "输入值超出short类型允许范围" << endl; return 1; } short a = static_cast<short>(input_val); cout << a << endl; return 0; }
方案2:检测输入流的错误状态
C++标准输入流在读取值超出目标类型范围、或输入类型不匹配时,会自动设置failbit错误标记,你可以直接判断流状态来捕获异常:
示例代码:
#include <iostream> using namespace std; int main() { short a; cin >> a; if (!cin) { // 流状态异常,包含溢出、类型不匹配等所有输入错误 // 此处写你的异常处理逻辑 cout << "输入非法" << endl; // 必须重置流状态、清空缓冲区才能继续后续输入操作 cin.clear(); cin.ignore(1024, '\n'); return 1; } cout << a << endl; return 0; }
该方案的局限性是无法区分异常是输入溢出还是输入了非数字字符,仅适合不需要细分错误类型的场景。
注意:绝对不要尝试读取到short变量后再判断值是否超出范围,有符号整数溢出的未定义行为会导致判断逻辑完全失效,甚至程序在判断执行前就已经崩溃。
内容的提问来源于stack exchange,提问作者user16548504
相关产品推荐
相关产品推荐

