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

5voto

Roi Danton Points 1602

Avec C++20, vous pouvez utiliser std::basic_string::starts_with (o std::basic_string_view::starts_with ) :

#include <string_view>

std::string_view bigString_v("Winter is gone"); // std::string_view avoids the copy in substr below.
std::string_view smallString_v("Winter");
if (bigString_v.starts_with(smallString_v))
{
    std::cout << "Westeros" << bigString_v.substr(smallString_v.size());
}

1voto

rogerlsmith Points 1937

strstr() renvoie un pointeur sur la première occurrence d'une chaîne dans une chaîne.

1voto

James Kanze Points 96599

L'approche la plus simple serait :

if ( smallString.size() <= bigString.size()
    && std::equals( smallString.begin(), smallString.end(), bigString.end() )

(Cela fonctionnera également si l'un des deux, ou les deux, sont un vecteur. Ou tout autre type de conteneur standard).

0voto

cute_ptr Points 583

J'ai pensé qu'il était logique de poster une solution brute qui n'utilise aucune fonction de la bibliothèque...

// Checks whether `str' starts with `start'
bool startsWith(const std::string& str, const std::string& start) {
    if (&start == &str) return true; // str and start are the same string
    if (start.length() > str.length()) return false;
    for (size_t i = 0; i < start.length(); ++i) {
        if (start[i] != str[i]) return false;
    }
    return true;
}

L'ajout d'un simple std::tolower nous pouvons faire en sorte que cela ne soit pas sensible à la casse

// Checks whether `str' starts with `start' ignoring case
bool startsWithIgnoreCase(const std::string& str, const std::string& start) {
    if (&start == &str) return true; // str and start are the same string
    if (start.length() > str.length()) return false;
    for (size_t i = 0; i < start.length(); ++i) {
        if (std::tolower(start[i]) != std::tolower(str[i])) return false;
    }
    return true;
}

0voto

Je suis surpris que personne n'ait encore posté cette méthode :

#include <string>    
using namespace std;

bool starts_with(const string& smaller_string, const string& bigger_string) 
{
    return (smaller_string == bigger_string.substr(0,smaller_string.length()));
}

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