C++中从字符串提取正负整数的通用实现方法求助
兄弟,我太懂这种被字符串提取整数值折磨的痛苦了!你之前写的代码只能抓单个数字,碰到多位数或者负数直接歇菜,其实正则表达式就是解决这种问题的最优解,我来给你详细说说怎么弄,包你能搞定这些汇编指令的提取需求。
思路分析
不管是r23里的23、R10里的10,还是-3这种带负号的立即数,本质都是正负整数——有的跟在r/R后面,有的是独立的。我们可以先把所有整数完整提取出来,再根据指令类型分配到对应的rs1、rs2、imm变量里,这样能适配不同的指令格式。
正则表达式设计
用-?\d+就可以完美匹配所有目标整数:
-?表示负号是可选的(覆盖正数和负数)\d+表示匹配一个或多个数字(覆盖单数字和多位数)
C++ 实现代码
第一步:写一个提取整数的工具函数
这个函数会遍历整行输入,把所有匹配到的整数转换成int类型存起来:
#include <iostream> #include <string> #include <regex> #include <vector> #include <algorithm> std::vector<int> extractIntegers(const std::string& line) { std::vector<int> nums; // 用原始字符串字面量,不用转义反斜杠 std::regex numRegex(R"(-?\d+)"); std::sregex_iterator it(line.begin(), line.end(), numRegex); std::sregex_iterator end; for (; it != end; ++it) { nums.push_back(std::stoi((*it).str())); } return nums; }
第二步:处理指令逻辑
先识别指令类型(比如subi还是Lb),再把提取到的整数分配给对应的变量:
int main() { std::string line; std::cout << "输入汇编指令(按回车结束每行,Ctrl+C退出):" << std::endl; while (std::getline(std::cin, line)) { // 提取操作码(指令的第一个单词) size_t firstSpace = line.find(' '); if (firstSpace == std::string::npos) { std::cerr << "无效指令:找不到操作码" << std::endl; continue; } std::string opcode = line.substr(0, firstSpace); // 转小写,统一处理大小写差异(比如Lb和lb都能识别) std::transform(opcode.begin(), opcode.end(), opcode.begin(), ::tolower); std::vector<int> nums = extractIntegers(line); if (nums.size() != 3) { std::cerr << "指令格式错误:" << line << "(需要3个数值参数)" << std::endl; continue; } int rs1, rs2, imm; if (opcode == "subi") { rs1 = nums[0]; rs2 = nums[1]; imm = nums[2]; std::cout << "解析结果:rs1=" << rs1 << ", rs2=" << rs2 << ", imm=" << imm << std::endl; } else if (opcode == "lb") { rs1 = nums[0]; imm = nums[1]; rs2 = nums[2]; std::cout << "解析结果:rs1=" << rs1 << ", rs2=" << rs2 << ", imm=" << imm << std::endl; } else { std::cerr << "暂不支持的指令:" << opcode << std::endl; } } return 0; }
代码优势
- 自动处理大小写:不管是
R10还是r10,都能正确提取到10 - 完美支持多位数:比如
435会被完整提取成一个整数,不会拆成4、3、5 - 正确识别负数:比如
-3会直接提取为-3,不需要额外处理符号 - 扩展性强:以后要加其他指令(比如
addi、sw),只需要新增else if分支,调整整数的分配顺序即可
内容的提问来源于stack exchange,提问作者Ker
相关产品推荐
相关产品推荐

