Возьмите +/- вставки из строки в C ++ - PullRequest
0 голосов
/ 19 марта 2019

Я уже некоторое время бью свою голову об стену. То, что я пытаюсь сделать, это прочитать строку ввода и извлечь из нее целые числа и сохранить их для последующего использования.

Пример ввода:

subi 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 и поместите его в вектор.

Хотя я думаю, что моя идея может сработать, я очень надеюсь, что есть лучший способ.

Спасибо всем!

1 Ответ

0 голосов
/ 20 марта 2019

Хорошо, поэтому, используя 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;

}

...