A la recherche d'un tableau de c-chaînes pour une sous-chaîne en utilisant string_algo / gammes

StackOverflow https://stackoverflow.com/questions/8312975

  •  25-10-2019
  •  | 
  •  

Question

Je dois rechercher un tableau de c-strings pour une sous-chaîne.

Je créé ce que je pensais me retourner la réponse, mais il est seulement correct, mais syntaxiquement sémantiquement mal, mais je ne sais pas où je suis allé mal.

Il y a aussi une sous-question à ce sujet. Ce que je vais demander après vous montrer l'exemple que j'ai essayé.

#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

Les résultats de l'iterator que je ne l'ai pas écrit cela correctement.

Je ne sais pas si le fait que le premier paramètre est en fait const char [8] a un effet préjudiciable.

Ma principale question que dois-je faire pour la corriger, et la question supplémentaire est comment puis-je extraire le type qui find_first exige de constCharRange ou bien une telle typedef.

Modifier:

Je vois que je l'ai utilisé incorrectement fin. Je l'ai ensuite réussi à obtenir par exemple un peu différent au travail mais ils ne sont pas compatibles avec les définitions que j'ai en fait à utiliser (je peux ajouter au code mais pas modifier la définition actuelle).

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);
    }
}

Un autre 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);
    }
}

Voici le plus proche que je peux obtenir, mais je ne peux pas sembler obtenir le bon type de retour de

void StringTest4()
{
    const char Months[12][20]Months[]= { /*same data as before*/
    std::find(boost::begin(Months), boost::end(Months), "February");
}
Était-ce utile?

La solution

Je peux corriger StringTest4 faire des correspondances exactes, mais cette solution ne fonctionnera pas pour les partielles.

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);
    }
}

Notez le passage de std :: string plutôt que "February" si nous ne le faisons pas std::find alors sera simplement faire une comparaison de pointeur qui se traduirait donc par un échec.

Je préfère encore utiliser cela avec string_algo, mais je ne suis toujours pas sûr quels bits je aurais besoin pour que cela fonctionne avec succès const char Months[12][20]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top