Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Funkcja StringBetween, jak napisać podobną w c/c++?


Rekomendowane odpowiedzi

Opublikowano

Witam.

 

W AutoIt istnieje funkcja _StringBetween, która pozwala na wydobycie jakiegoś ciągu znaków z innego ciągu, i zwraca tablicę z wynikami. W c/c++ bardzo mi tego brakuje, jak mógłbym napisać podobną funkcję? Zależy mi na tym aby zwracała wszystkie znalezione wyniki w formie tablicy np.:

 

Tekst: <b>aaa</b><b>bbb</b><b>ccc</b>

po wykonaniu funkcji w której argumentami by było "<b>" oraz "</b> zwróciłby

[0] = aaa

[1] = bbb

[2] = ccc

Opublikowano

To tak  typowa funkcja, że problem pewnie był już rozwiązany miliard razy - pierwszy wynik z googla:

 

http://stackoverflow.com/questions/18800796/c-get-string-between-two-delimiter-string

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

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

int main()
{
    const std::string leftDelimeter = "1";
    const std::string rightDelimeter = "2";
    const std::string str = "1jeden2sadsadasd1dwa2asdxzc12asdasdasdasdxzczxcz1cztery22221piec2";
    std::vector<std::string> chunks;
    size_t last = 0;
    for(;
    {
        size_t first = str.find(leftDelimeter, last);
        if(first == std::string::npos) break;
        last = str.find(rightDelimeter, first);
        if(last == std::string::npos) break;
        chunks.push_back(str.substr(first + 1, last - first - 1));
    }
    for(const auto& s : chunks) std::cout << s << '\n';
    return 0;
}

Nie będzie znajdzie wszystkich jeśli będą jakieś zagnieżdżone.

Np

1a1b2c2

zwroci

a1b

Opublikowano

Dziękuję, mi zawsze zwracało tylko pierwszy wynik a przy próbie użycia pętli już w ogóle nie działało :). To, że nie znajduje zagnieżdżonych wcale nie przeszkadza.

 

@Edit

 

Jednak nie działa to wszystko tak jak bym do końca chciał, jeżeli zmienimy argumenty z "1"; "2"  na np. "<b>"; "</b>" to zwraca "b>text", zamiast "text"(na to akurat mam pomysł, musiałbym tylko policzyć ilość znaków i usunąć ją z końcowego napisu, ale póki co nie próbowałem bo jest pełno innych błędów). Pętla która ma wyświetlać tablicę, crashuje program. I nie mogę przypisać s do tablicy, przypisuje tylko pierwsze trzy wyniki, po czym także crashuje program. Kod:

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

using namespace std;

string* _StringBetween(string sString, string sStart, string sEnd, string arr[]){
    vector<string> chunks;
    size_t last = 0;
    for(;
    {
        size_t first = sString.find(sStart, last);
        if(first == string::npos) break;
        last = sString.find(sEnd, first);
        if(last == string::npos) break;
        chunks.push_back(sString.substr(first + 1, last - first - 1));
    }
    int ii = 0;
    for(auto& s : chunks){
        arr[ii] = s;
        ++ii;
    }
    return arr;
}

int main(){
    //string s = "dsadsada<b>aaa</b>dasds<b>bbb</b>adsad<b>ccc</b>sad";
    string s = "1jeden2sadsadasd1dwa2asdxzc12asdasdasdasdxzczxcz1cztery22221piec2";
    string tablica[] = {};
    string *a = _StringBetween(s, "1", "2", tablica);
    //string *a = _StringBetween(s, "<b>", "</b>", tablica);
    cout << "Array size: " << sizeof(a) << endl;
    //for(int i = 0; i < sizeof(a) + 1; i++){
        cout << a[0] << endl;
        cout << a[1] << endl;
        cout << a[2] << endl;
        cout << a[3] << endl;
        cout << a[4] << endl;
    //}
return 0;
}

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

int main()
{
    const std::string leftDelimeter = "1";
    const std::string rightDelimeter = "2";
    const std::string str = "1jeden2sadsadasd1dwa2asdxzc12asdasdasdasdxzczxcz1cztery22221piec2";
    std::vector<std::string> chunks;
    size_t last = 0;
    for(;
    {
        size_t first = str.find(leftDelimeter, last) + leftDelimeter.size();
        if(first == std::string::npos) break;
        last = str.find(rightDelimeter, first);
        if(last == std::string::npos) break;
        chunks.push_back(str.substr(first, last - first - 1));
        last += rightDelimeter.size();
    }
    for(const auto& s : chunks) std::cout << s << '\n';
    return 0;
}

Głupi błąd, nie brałem pod uwagę rozmiarów stringów w moim przykładzie.

Powiedz czy teraz będzie działać, nie sprawdzałem.

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

int main()
{
    const std::string leftDelimeter = "11";
    const std::string rightDelimeter = "2222";
    const std::string str = "11jeden2222sadsadasd1dwa2asdxzc112asdasdasdasdxzczxcz1cztery22221piec2";
    std::vector<std::string> chunks;
    size_t last = 0;
    for(;
    {
        size_t first = str.find(leftDelimeter, last);
        if(first == std::string::npos) break;
        first += leftDelimeter.size();
        last = str.find(rightDelimeter, first);
        if(last == std::string::npos) break;
        chunks.push_back(str.substr(first, last - first));
        last += rightDelimeter.size();
    }
    for(const auto& s : chunks) std::cout << s << '\n';
    return 0;
}



Teraz sprawdziłem, jeszcze raz sory.

Opublikowano

Dzięki, problem rozwiązany, przy okazji dowiedziałem się o istnieniu i nauczyłem się czegoś o wektorach. :)

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...