我一直在为这一个打我的头。我要做的是读取一行输入并从中获取内容并存储以供以后使用。
示例输入:
经历了r23,R10,435
Lb r3,-3(r10)
示例结果:
关于'subi'线,我需要3个变量rs1 = 23,rs2 = 10,imm = 435.对于Lb,我需要rs1 = 3,rs2 = 10,并且imm = -3。
有许多不同类型的输入和它们的编写方式,所以我正在寻找最通用的方法。我认为正则表达式是答案,但我个人无法得到任何工作,这也许是我对正则表达式的无知。当我说我无法得到任何工作时,我的意思是,我老实说无法发布我在这里尝试的内容,因为我很确定我只是制作东西。目前我正在使用这个想法:
for(int i = 0; line[i] != '\0'; i++){
if(isdigit(line[i]) != 0){
temp += line[i];
}
}
rs1tmp = temp[1];
rs1 = stoi(rs1tmp);
rs2tmp = temp[2];
rs2 = stoi(rs2tmp);
rdtmp = temp[0];
rd = stoi(rdtmp);
这个想法的问题是,它只能让我从线上的每一个数字。它不适用于双位数或负数。我正在考虑嵌套一些if语句来检查数字旁边的东西。因此,一旦找到一个数字,我可以向左看,检查它是否为“ - ”并向右看并检查它是否为数字。然后采取那些if的解决方案并将其推送到矢量。
虽然我认为我的想法可行,但我真的希望有更好的方法。
感谢大家!
好的,所以使用boost :: tokenizer我想出了这个功能,它完美无缺。它抓取所有正数或负数,并将它们存储到一个向量中供我以后使用:
vector<string> getNumbers(string s){
vector<string> result;
typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
s=s.substr(s.find_first_of(" \t")+1);
boost::char_separator<char> sep{" ,rR()"};
tokenizer tok{s, sep};
for (auto it = tok.begin(); it != tok.end(); ++it)
result.push_back(*it);
return result;
}