Pregunta

Necesito buscar una variedad de cuerdas C para una subcadena.

Creé lo que pensé que me devolvería la respuesta, pero solo es sintácticamente correcta pero semánticamente incorrecta, pero no estoy seguro de dónde me he equivocado.

También hay una subcuestión para esto. Que le preguntaré después de mostrarle el ejemplo que probé.

#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

Los resultados del iterador muestran que no he escrito esto correctamente.

No estoy seguro de si el hecho de que el primer parámetro sea realmente const char [8] está teniendo un efecto perjudicial.

Mi pregunta principal qué debo hacer para corregirlo, y la pregunta complementaria es cómo puedo extraer el tipo que Find_first requiere de Constcharrange o de hecho cualquier typedef.

Editar:

Veo que he usado en extremo incorrectamente. Luego he logrado obtener un ejemplo ligeramente diferente para funcionar, sin embargo, no son compatibles con las definiciones que realmente tengo que usar (puedo agregar al código pero no cambiar la definición existente).

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

Otra prueba

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

Aquí está el más cercano que puedo obtener, pero parece que no puedo obtener la especificación de tipo de retorno correcta

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

Solución

Puedo corregir StringTest4 para hacer coincidencias exactas, sin embargo, esta solución no funcionará para las parciales.

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

Tenga en cuenta el paso de std :: cadena en lugar de solo "February" Si no hacemos esto entonces std::find Solo hará una comparación de puntero que, por lo tanto, dará como resultado una falla.

Todavía preferiría usar esto con String_algo, pero todavía no estoy seguro de con qué bits necesitaría para que trabaje con éxito const char Months[12][20]

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top