Jak wyciągnąć cyfry ze stringa i połączyć je w jedną liczbę (konkatenacja)?

0

Czy ktoś z doświadczonych programistów pomoże mi rozwiązać problem jak ze stringa np. a54e8k12
wyciągnąć liczby, które występują tj. 54, 8 oraz 12? Z 8 nie ma problemu, nastomiast z liczbami?

Ja najpierw przechodzę po kolei po wszystkich znakach i sprawdzam czy dany znak w stringu jest cyfrą. Następnie sprawdzam czy następny po nim też jest cyfrą: - jeśli nie, to wypisuję ten "znaleziony" (tutaj byłoby to 8); - jeśli jednak nast. znak jest cyfrą, to połącz te dwie cyfry w liczbę (tutaj 5 i 4 w 54 itd.)

3

Jak chcesz armatę na muchę to jest std::regex:

    auto s = "a54e8k12"s;
    std::vector<std::string> numbers;
    std::regex num{R"((\d+))"};
    std::transform(std::sregex_iterator{s.begin(), s.end(), num},
                   std::sregex_iterator{},
                   std::back_inserter(numbers),
                   [](auto& m){
        return std::smatch{m}.str();
    });

https://wandbox.org/permlink/PxFQIVOltgVyythT

0

ewentualnie mozesz zrobic split
https://stackoverflow.com/questions/236129/most-elegant-way-to-split-a-string

i jako warunek zrobic ze jezeli tekst[i] nie jest cyfra to zrob split. Jezeli split posiada jakies wyniki (nie jest pusty) dodaj do listy i zwroc liste z liczbami

PS nie zwracaj nulla jezeli nie znajdziesz nic z stringu tylko pusty vector

EDIT
@kq sluznie zauwazyl, ze rozwiazania wymagaja streama. Wiec najpierw przygotuj sobie stringa. Wszystko co tam jest po za liczbami zmien na spacje i wtedy przepusc przez stream. Zgadza sie, bedzie to dosc wolne rozwiazanie. Ale nie na tyle wolne by sie nim przejmowac.

0

Przerabiam kurs c++ i jestem jeszcze na etapie początkującego, więc zupełnie nie rozumiem pojęć przez Was użytych ;) Muszę zrobić to mniej zaawansowanym sposobem.
Mimo to wielkie dzięki za fatygę i odpowiedź na mój post.
Kombinuję dalej...

0

Zawsze możesz ustawić jakąś zmienną na 0, i póki będziesz natykał się na cyfry mnożyć ją razy 10 i dodawać tą cyfrę.

0

to kombinuj tak by zrozumiec to co Ci dalismy. Wiem ze to nie jest latwe, ale duzo wiecej sie nauczysz niz z tych kursow ktore bedziesz czytal.

Dostales wlasnie odpowiedz tak jakbys pracowal jako normalny programista (jakbys pracowal, to bys wiedzial co szukac wiec znalazlbys sobie sam).

Rob od razu cos tak jak powinno byc

0
    auto s = "a54e8k12"s;
    auto result = ""s;
    for (auto ch : s)
    {
        if (isdigit(ch))
        {
            result += ch;
        }
    }
    cout << result << endl;
    auto x = std::stoi(result);
    cout << (x + 10) << endl;

https://wandbox.org/permlink/Hp9JpbiVPFnuR7Kl

0

Wersja prymitywna.

#include <cctype>
#include <string>
#include <vector>

std::vector< int > ExtractNumbs( const std::string& input )
{
	std::vector< int > numbs;
	std::string tmp;
	for ( std::size_t i = 0; i < input.length(); ++i ) {
		if ( std::isdigit( input[ i ] ) ) {
			tmp += input[ i ];
		}
		else {
			if ( !tmp.empty() ) {
				numbs.emplace_back( std::stoi( tmp ) );
				tmp.clear();
			}
		}
	}
	if ( !tmp.empty() ) {
		numbs.emplace_back( std::stoi( tmp ) );
	}
	return numbs;
}
0

Dzięki fasadin, przeanalizowałem Wasze propozycje, ale do głowy przyszedł mi inny pomysł, dla bardzo początkujących :)

Mianowicie wyciągam ze stringa cyfry i zapisuję je do nowoutworzonej zmiennej.
Następnie ta wartość w tej nowoutworzonej zmiennej jest mi potrzebna, więc zamieniam ją na int'a. Niby prosta sprawa, ale na moim przykładzie nie wychodzi. Robię w innym projekcie, łatwiejsze porównania i jest ok. Gdzie mam błąd?

Oto część mojego kodu:
``int main()
{
string wyraz = "A24";
int dlugosc = wyraz.length();
string liczba;

for (int i=0; i<dlugosc; i++)    //petla analizuje znaki w stringu czy sa cyfry
{
    if ((wyraz[i]>=49 && wyraz[i]<=57))
    {
        liczba= wyraz.substr(i,1);   //w ten sposob przypisuje wystepujace cyfry do nowej zmiennej string
    }
    cout<<liczba;         //to jest rzeczywiscie 24
}

int nowaNaInt = atoi(liczba.c_str());   //teraz chce zamienic na int'a ta zmienna liczba
cout<<nowaNaInt;              //pokazuje wartosc 4 :/

for (int j=0; j<nowaNaInt; j++)    //petla wypisujaca na ekranie 24 razy litere A, co oczywiscie nie udaje sie
{
    cout<<wyraz;
}``
0
vector<int> ReadIntsIgnoreOtherData(istream& in)
{
      vector<int> result;
      while (in.good())
      {
          int x;
          while (in >> x)
              result.push_back(x);
          if (in.fail() && !in.bad())
          {
                in.clear();
                while (in.good() && !isdigit(in.peek()) && in.peek() != '-')
                      in.get();
          }
      }
      return result;
}

Jest mały bug, ale widzę, że kody wyżej też go mają :P.
https://wandbox.org/permlink/KX9P7p07QKwJtdEY

2
	string s = "a54e8k12";
	
	for(auto it = s.begin(); it != s.end();)
	{
		int n = 0;
		string w;
		
		while(!isdigit(*it)) w += *it++;
		while(isdigit(*it)) { n *= 10; n += *it++ - '0'; }
		fill_n(ostream_iterator<string>(cout), n, w);
		cout << '\n';
	}
0

A jeśli mam taki przykład:
string a = "123,456,789";

i chciałem dodać występujące liczby do nowych oddzielnych stringów, to jak taki oto kod z c# przerobić na c++:

string a = "123,456,789";
string[] b = a.Split(',');
foreach (string s in b)
{
Console.WriteLine(s);
}
0

Masz w pierwszej odpowiedzi (albo w tej od fasadina).

1

Możesz też użyć sscanf. Tu masz przykład: https://ideone.com/cLv1w4

1 użytkowników online, w tym zalogowanych: 0, gości: 1