Frage

Ich muss nach einem Substring nach einer Reihe von C-Strings suchen.

Ich habe das geschaffen, was ich dachte, würde mir die Antwort zurückgeben, aber sie ist nur syntaktisch korrekt, aber semantisch falsch, aber ich bin mir nicht sicher, wo ich mich falsch gemacht habe.

Es gibt auch eine Unterfristung. Was ich fragen werde, nachdem ich Ihnen das Beispiel gezeigt habe, das ich versucht habe.

#include <boost/algorithm/string/find.hpp>

const char Months[12][20] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

void Test()
{
    typedef boost::iterator_range<boost::range_iterator<const char [20]>::type > constCharRange;
    boost::iterator_range<char const *> ir = find_first("January", months);
}

ir.First == ir.last

Die Ergebnisse des Iterators zeigen, dass ich dies nicht richtig geschrieben habe.

Ich bin mir nicht sicher, ob die Tatsache, dass der erste Parameter tatsächlich ist const char [8] hat einen schädlichen Effekt.

Meine Hauptfrage, was ich tun soll, um es zu korrigieren, und die ergänzende Frage ist, wie ich den Typ extrahieren kann, den find_first von constcharrange oder tatsächlich ein solcher Typedef benötigt.

Bearbeiten:

Ich sehe, dass ich das Ende falsch verwendet habe. Ich habe es dann geschafft, ein leichtes Beispiel zu erhalten, um zu funktionieren, aber sie sind nicht mit den Definitionen kompatibel, die ich tatsächlich verwenden muss (ich kann den Code hinzufügen, aber die vorhandene Definition nicht ändern).

const std::string Months[]= { /*same data as before*/
void StringTest2()
{
    const std::string* sptr =0;
    sptr = std::find(boost::begin(Months), boost::end(Months), std::string("February"));
    if (sptr)
    {
        string sResult(*sptr);
    }
}

Ein weiterer Test

const char* Months[]= { /*same data as before*/
void StringTest3()
{
    const char **sptr = std::find(boost::begin(Months), boost::end(Months), "February");
    if (sptr)
    {
        string sResult(*sptr);
    }
}

Hier ist das nächste, was ich bekommen kann, aber ich kann den Rückgabetyp nicht richtig machen

void StringTest4()
{
    const char Months[12][20]Months[]= { /*same data as before*/
    std::find(boost::begin(Months), boost::end(Months), "February");
}
War es hilfreich?

Lösung

Ich kann StringTest4 korrigieren, um genau übereinstimmende Übereinstimmungen durchzuführen. Diese Lösung funktioniert jedoch nicht für teilweise.

void StringTest4()
{
    boost::range_iterator<const char [12][20]>::type sptr = std::find(boost::begin(Months), boost::end(Months), std::string("February"));
    if (sptr)
    {
        string sResult(*sptr);
    }
}

Beachten Sie die Übergabe von STD :: String und nicht nur die "February" Wenn wir das dann nicht tun std::find Wird nur einen Zeigervergleich durchführen, der daher zu einem Fehler führen würde.

Ich würde dies immer noch lieber mit String_Algo verwenden, aber ich bin mir immer noch nicht sicher const char Months[12][20]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top