2010-02-26 7 views
289

J'ai une variable de type chaîne. Je veux vérifier s'il contient une certaine chaîne. Comment ferais-je cela?Vérifie si une chaîne contient une chaîne en C++

Existe-t-il une fonction qui renvoie true si la chaîne est trouvée et false si elle ne l'est pas?

+4

Voulez-vous dire char * chaîne ou la chaîne de la STL? – anthares

+0

Ce n'est pas une chaîne char *. J'ai dû #include pour l'utiliser. – neuromancer

+0

Certaines des solutions utilisent s2 pour la chaîne que je veux trouver. Cela fonctionnera-t-il encore si j'utilise quelque chose comme "c'est une chaîne" au lieu de s2? – neuromancer

Répondre

438

Utilisation std::string::find comme suit:

if (s1.find(s2) != std::string::npos) { 
    std::cout << "found!" << '\n'; 
} 

Note: "trouvé!" sera imprimé si s2 est une sous-chaîne de s1, les deux s1 et s2 sont de type std :: string.

76

Vous pouvez essayer d'utiliser la fonction find:

string str ("There are two needles in this haystack."); 
string str2 ("needle"); 

if (str.find(str2) != string::npos) { 
//.. found. 
} 
15

En fait, vous pouvez essayer d'utiliser la bibliothèque Boost, je pense que std :: string ne fournit pas assez méthode pour faire toute la chaîne commune operation.In coup de pouce, vous pouvez simplement utiliser le boost::algorithm::contains:

#include "string" 

#include "boost/algorithm/string.hpp" 

using namespace std; 
using namespace boost; 
int main(){ 
    string s("gengjiawen"); 
    string t("geng"); 
    bool b = contains(s, t); 
    cout << b << endl; 
    return 0; 
} 
+15

"Je pense que std :: string ne fournit pas assez de méthode pour faire toutes les opérations de chaîne courantes". Mais il existe une méthode 'find' pour exactement la tâche en question. Pas besoin d'introduire une dépendance de bibliothèque. – stefan

+4

@stefan, vous avez raison, il existe une méthode de recherche, mais qu'en est-il de split, remplacer et beaucoup d'autres staff.You pouvez comparer std :: string à la chaîne api dans Java.PS:Also je pense que contient est beaucoup plus élégant que trouver pour vérifier si une chaîne contient une autre chaîne. –

4

vous pouvez essayer cette

string s1 = "Hello"; 
string s2 = "el"; 
if(strstr(s1.c_str(),s2.c_str())) 
{ 
    cout << " S1 Contains S2"; 
} 
4

Si vous ne souhaitez pas utiliser les fonctions de bibliothèque standard, voici une solution.

#include <iostream> 
#include <string> 

bool CheckSubstring(std::string firstString, std::string secondString){ 
    if(secondString.size() > firstString.size()) 
     return false; 

    for (int i = 0; i < firstString.size(); i++){ 
     int j = 0; 
     if(firstString[i] == secondString[j]){ 
      while (firstString[i] == secondString[j] && j < secondString.size()){ 
       j++; 
       i++; 
      } 

      if (j == secondString.size()) 
        return true; 
     } 
    } 
    return false; 
} 

int main(){ 
    std::string firstString, secondString; 

    std::cout << "Enter first string:"; 
    std::getline(std::cin, firstString); 

    std::cout << "Enter second string:"; 
    std::getline(std::cin, secondString); 

    if(CheckSubstring(firstString, secondString)) 
     std::cout << "Second string is a substring of the frist string.\n"; 
    else 
     std::cout << "Second string is not a substring of the first string.\n"; 

    return 0; 
} 
1

Ceci est une simple fonction

bool find(string line, string sWord) 
{ 
    bool flag = false; 
    int index = 0, i, helper = 0; 
    for (i = 0; i < line.size(); i++) 
    { 
     if (sWord.at(index) == line.at(i)) 
     { 
      if (flag == false) 
      { 
       flag = true; 
       helper = i; 
      } 
      index++; 
     } 
     else 
     { 
      flag = false; 
      index = 0; 
     } 
     if (index == sWord.size()) 
     { 
      break; 
     } 
    } 
    if ((i+1-helper) == index) 
    { 
     return true; 
    } 
    return false; 
} 
+1

Bonjour, bienvenue à SO. Pourriez-vous s'il vous plaît [modifier] votre réponse et ajouter un commentaire sur comment cela fonctionne et comment il diffère des autres réponses? Je vous remercie! –

-1
#include <algorithm>  // std::search 
#include <string> 
using std::search; using std::count; using std::string; 

int main() { 
    string mystring = "The needle in the haystack"; 
    string str = "needle"; 
    string::const_iterator it; 
    it = search(mystring.begin(), mystring.end(), 
       str.begin(), str.end()) != mystring.end(); 

    // if string is found... returns iterator to str's first element in mystring 
    // if string is not found... returns iterator to mystring.end() 

if (it != mystring.end()) 
    // string is found 
else 
    // not found 

return 0; 
} 
+3

S'il vous plaît, essayez d'éviter de jeter du code en guise de réponse et essayez d'expliquer ce qu'il fait et pourquoi. Votre code peut ne pas être évident pour les personnes qui n'ont pas l'expérience de codage appropriée. Veuillez modifier votre réponse pour inclure [clarification, contexte et essayer de mentionner les limitations, hypothèses ou simplifications dans votre réponse.] (Https://stackoverflow.com/help/how-to-answer) –

Questions connexes