2010-05-19 5 views
0

Par exemple, permet de dire que j'ai cette chaîne:C++, la recherche et la valeur de retour

"Name, Name2, <b>Name3</b>, Name4, <b>Name5</b>" 

Je suis en train d'obtenir toute valeur/nom est à l'intérieur des balises <b>. Donc, quand je recherche le char, je reçois ce qui suit dans un tableau:

Des idées? Merci

+1

Vous pouvez jeter un oeil à 'string :: find': http://www.cplusplus.com/reference/string/string/find/. –

Répondre

0
start = strstr(s, "<b>")+3; 
stop = strstr(start, "</b>"); 
strncpy(result, start, stop-start); 

N'oubliez pas d'ajouter une vérification d'erreur.

matchs suivants, pour les paresseux:

s = stop+3; 

exécuter à nouveau le code ci-dessus. [EDIT] Pour arrêter/vérifier les erreurs: vérifier le code retour de strstr.

+0

Je n'ai pas downvote, mais ceci est étiqueté C++, pas C. De plus, cela ne renvoie qu'un seul résultat. – Yacoby

+0

Cela ne fonctionne que pour un match. Et s'il y avait plusieurs matches? Strstr et strncpy – pure841

+5

sont également disponibles en C++. :) –

1

est ici une version de base en utilisant uniquement STL qui suppose que les balises ne sont pas imbriqués ou toute autre conduite répréhensible

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

int main() 
{ 
    const std::string TAG_OPEN("<b>"); 
    const std::string TAG_CLOSE("</b>"); 
    const std::string s("Name, Name2, <b>Name3</b>, Name4, <b>Name5</b>"); 

    typedef std::vector<std::string> StringArray; 
    StringArray tagContents; 

    std::string::size_type index = 0; 
    while(index != std::string::npos) 
    { 
     const std::string::size_type o = s.find(TAG_OPEN, index); 
     if (o == std::string::npos) 
     { 
      break; 
     } 

     const std::string::size_type c = s.find(TAG_CLOSE, index); 
     if (c == std::string::npos) 
     { 
      // mismatched tag, ignore? 
      break; 
     } 

     const std::string::size_type tagContentsStart = o + TAG_OPEN.size(); 
     const std::string::size_type tagContentsFinish = c; 
     tagContents.push_back(
      s.substr(tagContentsStart 
        , tagContentsFinish - tagContentsStart)); 

     index = c + TAG_CLOSE.size(); 
    } 


    for (StringArray::const_iterator S = tagContents.begin(); 
             S != tagContents.end(); 
            ++S) 
    { 
     std::cout << *S << std::endl; 
    } 

    return 0; 
} 
+0

Je ne travaille pas avec des chaînes, je travaille avec des caractères. – pure841

+0

@ pure841: Eh bien oui, mais la plupart, sinon la totalité, des algorithmes C++ fonctionneront avec une sorte de wrapper autour de caractères bruts tels que 'std :: string'. Si vous ne voulez vraiment travailler qu'avec des caractères, vous devriez probablement ré-étiqueter la question en C plutôt qu'en C++. – Troubadour

+0

@ pure841: Mettez vos caractères dans un 'std :: string', puis utilisez le' std :: string' pour l'analyse. –

0

Si vous refusez d'utiliser std::string et insistez sur l'utilisation de la chaîne de style C, vous pouvez toujours être aventureux et utilisez strtok. Il a la particularité de modifier vos chaînes de texte.

Veuillez lire les effets secondaires de strtok avant de l'utiliser.

Je suggère toujours fortement de créer un std::string avec vos caractères, puis d'utiliser le std::string pour l'analyse. Il y a beaucoup plus de fonctionnalités avec std::string qu'avec les chaînes de style C.

Questions connexes