应使用 std::getline 读整行再用 std::stringstream 解析,避免 cin >> 跳过运算符或因无空格导致读取错误;仅支持单二元运算,多运算需两遍扫描处理优先级;须用 try-catch 处理 stod 异常,检查除零时用 abs(b)
用
std::stringstream和std::getline解析单行表达式用户输入形如
"3 + 5 * 2"的字符串时,不能直接用cin >>拆分——它会把"+"当作分隔符跳过,且无法处理空格不规范的输入(比如"3+5 *2")。稳妥做法是读整行,再用std::stringstream逐词提取:std::string line; std::getline(std::cin, line); std::stringstream ss(line); double a; char op; double b; if (ss >> a >> op >> b) { // 成功读到两个数和一个运算符 }注意:这仅适用于**单个二元运算**(如
"10 - 3"),不支持多运算符或括号。若用户输"1 + 2 + 3",ss >> a >> op >> b只取前三个 token(即1、'+'、2),末尾的"+ 3"被忽略。手写简易运算符优先级处理(无括号)
要支持
"3 + 5 * 2"正确算出13而非16,必须先识别乘除,再做加减。可采用“两遍扫描”策略:
- 第一遍:把输入按空格切分(或用
std::stringstream提取所有 token),存入std::vector<:string>- 第二遍:遍历 token,遇到
"*"或"/"就立即计算其左右数字,并用结果替换这三个元素(如{"3", "+", "5", "*", "2"}→ 合并"5", "*", "2"为"10",得到{"3", "+", "10"})- 第三遍:对剩余
"+"和"-"从左到右计算关键点:
std::stod()转数字时抛异常(如输入"abc"),务必用try-catch包裹;"-"既作减号也作负号,简单计算器通常只支持二元减法,不处理"-5 + 3"这类前缀负号。立即学习“C++免费学习笔记(深入)”;
避免
std::cin >>导致输入阻塞的典型错误常见错误写法:
double a, b; char op; std::cin >> a >> op >> b; // 若用户输 "3+5"(无空格),op 会读成 '3',b 读失败,流进入 failbit后果:
std::cin状态卡住,后续所有输入都被跳过。修复方式只有两种:
- 改用
std::getline+std::stringstream(推荐,见第一个副标题)- 若坚持用
>>,每次读后检查状态:if (!std::cin) { std::cin.clear(); std::cin.ignore(1000, '\n'); }另外,
std::cin >>对"3.14e2"这类科学计数法能正确解析,但对"3,14"(逗号小数点)直接失败——C++ 默认 locale 是英文格式,不支持千位分隔符或本地化小数点。除零和浮点精度问题怎么处理
除法必须显式检查:
if (b == 0.0)不可靠,因为浮点数比较需容忍误差。应写成:const double EPS = 1e-9; if (std::abs(b) < EPS) { std::cout << "Error: division by zero\n"; return; }但注意:这只能捕获真正接近零的除数,无法区分
0.0和-0.0(它们在 IEEE 754 中不同,但std::abs(-0.0)仍是0.0)。实际中,简单计算器可直接用b == 0.0判断,因为用户不会手动输-0.0。更隐蔽的问题是std::pow(0, 0)或开方负数——四则运算不涉及这些,但若后续扩展函数功能,必须单独拦截。浮点误差本身无法消除,例如
0.1 + 0.2输出0.30000000000000004。显示时可用std::setprecision(10) 控制小数位,但底层值不变。
0
0
相关文章
c++如何使用TensorRT进行模型部署优化_c++ NVIDIA推理引擎入门【AI】
如何用C++实现一个ECS(实体组件系统)?C++游戏引擎架构模式【游戏开发】
C++如何实现一个简单的A*寻路算法_C++游戏AI开发中的路径规划实战
C++如何实现一个简单的行为树_C++游戏AI中决策逻辑的行为树实现
c++ 矩阵乘法代码 c++矩阵运算实现教程
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。
1463
2023.10.24
Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
228
2024.02.23
if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。
723
2023.08.22
登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。
6072
2023.09.14
登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。
794
2023.09.14
获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。
1054
2023.12.21
token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。
1192
2024.03.01
热门下载
相关下载
精品课程
最新文章





