You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:32:59