54 votes

comment vérifier le début d'une chaîne de caractères en C++

Existe-t-il un moyen en C++ de vérifier si une chaîne de caractères commence par une certaine chaîne (plus petite que l'originale) ? Comme on peut le faire en Java

bigString.startswith(smallString);

85voto

Joachim Pileborg Points 121221
std::string s("Hello world");

if (s.find("Hello") == 0)
{
    std::cout << "String starts with Hello\n";
}

68voto

Alan Stokes Points 9095

Vous pouvez le faire avec string::compare() qui offre diverses options pour comparer tout ou partie de deux chaînes de caractères. Cette version compare smallString avec le préfixe de taille appropriée de bigString (et fonctionne correctement si bigString est plus courte que smallString ) :

bigString.compare(0, smallString.length(), smallString) == 0

J'ai tendance à emballer tout cela dans une fonction libre appelée startsWith() car sinon, cela peut sembler un peu mystérieux.

UPDATE : Le C++20 ajoute nouveau starts_with y ends_with de sorte que vous pourrez enfin écrire seulement bigString.starts_with(smallString) .

32voto

Kleist Points 3675

Les approches utilisant string::find() o string::substr() ne sont pas optimales car elles font une copie de votre chaîne de caractères, ou recherchent plus que des correspondances au début de la chaîne. Ce n'est peut-être pas un problème dans votre cas, mais si c'est le cas, vous pouvez utiliser la fonction std::equal algorithme. N'oubliez pas de vérifier que la "botte de foin" est au moins aussi longue que l'"aiguille".

#include <string>    

using namespace std;

bool startsWith(const string& haystack, const string& needle) {
    return needle.length() <= haystack.length() 
        && equal(needle.begin(), needle.end(), haystack.begin());
}

11voto

avakar Points 20031

La bonne solution, comme toujours, vient de Boost : boost::algorithm::starts_with .

5voto

Borzh Points 85

Pour optimiser un peu :

if ( smallString.size() <= bigString.size() &&
     strncmp( smallString.c_str(), bigString.c_str(), smallString.length() ) == 0 )

N'oubliez pas de #include <cstring> o #include <string.h>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X