String zwischen zwei Zeichen



  • Gibt es eine Funktion, die einen Teil eines Strings zwischen zwei Zeichen ermittelt?
    Also etwa sowas:

    string str = "(abcd)";
    str.getbetween("(",")");
    cout << str << endl;
    

    Das dann nur abcd ausgegeben wird?



  • Denkbar wäre

    #include <limits>
    #include <sstream>
    #include <string>
    
    std::string between(std::string const &s) {
      std::istringstream in(s);
      std::string token;
    
      in.ignore(std::numeric_limits<std::streamsize>::max(), '(');
      std::getline(in, token, ')');
    
      return token;
    }
    

    Allerdings gibt es da einige Designfragen zu beantworten. Was, zum Beispiel, soll in folgenden Fällen passieren?

    "abc"
    "(abc"
    "abc)"
    ")abc("
    "(ab(cd)ef)"
    "(ab(cd)(e)f"
    


  • seldon schrieb:

    Denkbar wäre

    #include <limits>
    #include <sstream>
    #include <string>
    
    std::string between(std::string const &s) {
      std::istringstream in(s);
      std::string token;
    
      in.ignore(std::numeric_limits<std::streamsize>::max(), '(');
      std::getline(in, token, ')');
    
      return token;
    }
    

    Danke, dass ist genau das was ich gesucht habe 🙂
    Wenn ich danach nochmal getline aufrufe, nimmt er dann den zweiten Abschnitt oder?
    Also wenn ich sowas hab:

    (abcd)(efgh)
    

    Dann kommt beim ersten mal abcd und beim zweiten mal efgh raus oder?

    seldon schrieb:

    Allerdings gibt es da einige Designfragen zu beantworten. Was, zum Beispiel, soll in folgenden Fällen passieren?

    "abc"
    "(abc"
    "abc)"
    ")abc("
    "(ab(cd)ef)"
    "(ab(cd)(e)f"
    

    Die Fälle gibts bei mir garnicht 😃
    Aber noch eine Frage hab ich. Ist es möglich zwei Trennzeichen zu benutzen, also ')' und '\n'?



  • Ich hab noch eine Frage zu dem Abschnit hier:

    in.ignore(std::numeric_limits<std::streamsize>::max(), '(');
    

    Bei mir ist max() ein Makro, und deswegen wird auch ein kompilerfehler erzeugt. Wie mache ich dem kompiler klar, dass es sich um die Funktion von numeric_limits handelt?



  • ranger schrieb:

    Ich hab noch eine Frage zu dem Abschnit hier:

    in.ignore(std::numeric_limits<std::streamsize>::max(), '(');
    

    Bei mir ist max() ein Makro, und deswegen wird auch ein kompilerfehler erzeugt. Wie mache ich dem kompiler klar, dass es sich um die Funktion von numeric_limits handelt?

    #undef max


Anmelden zum Antworten