как разобрать строку с целыми числами? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть строка

str="1Apple2Banana3Cat4Dog";

Как разобрать эту строку в

Apple
Banana
Cat
Dog

Я использовал для этого stringstream, как показано ниже, но не работал

stringstream ss(str);
int i;
while(ss>>i)
{
     ss>>s;
     cout<<s<<endl;
}

вывод:

Apple2Banana3Cat4Dog

что не является ожидаемым, Любая помощь?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы можете использовать std::regex для этого:

#include <iostream>
#include <regex>

std::string str{"1Apple2Banana3Cat4Dog"};

int main() {
    std::regex e{ "[0-9]{1}([a-zA-Z]+)" };
    std::smatch m;
    while (std::regex_search(str, m, e)) {
        std::cout << m[1] << std::endl;
        str = m.suffix().str();
    }
}

Выход:

Apple
Banana
Cat
Dog
0 голосов
/ 05 мая 2018

См. Этот фрагмент (должен работать для фруктов в количестве 0-9):

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){

    const string str = "1Apple2Banana3Cat4Dog";
    vector<int> pts;

    // marked integer locations
    for (int i = 0; i < str.size(); i++)
    {
        int r =  str[i] ; 
        if (r >= 48 && r <= 57)  // ASCII of 0 = 48 and ASCII of 9 = 57
        { 
            pts.push_back(i);
        }
    }

    // split string 
    for (int i = 0; i < pts.size(); i++)
    {
        string st1;
        if( i == pts.size()-1)
            st1 = str.substr(pts[i] + 1, (pts.size() - 1) - (pts[i] + 1));
        else
         st1 = str.substr(pts[i]+1, (pts[i+1])-(pts[i]+1) ); 
        cout << st1 << "  ";
    }       

    return 0;
}

Выход:

enter image description here

...