Pourquoi pas simplement :
bool prefix(const std::string& a, const std::string& b) {
if (a.size() > b.size()) {
return a.substr(0,b.size()) == b;
}
else {
return b.substr(0,a.size()) == a;
}
}
C++ pas C, sûr, simple, efficace.
Testé avec :
#include <string>
#include <iostream>
bool prefix(const std::string& a, const std::string& b);
int main() {
const std::string t1 = "test";
const std::string t2 = "testing";
const std::string t3 = "hello";
const std::string t4 = "hello world";
std::cout << prefix(t1,t2) << "," << prefix(t2,t1) << std::endl;
std::cout << prefix(t3,t4) << "," << prefix(t4,t3) << std::endl;
std::cout << prefix(t1,t4) << "," << prefix(t4,t1) << std::endl;
std::cout << prefix(t1,t3) << "," << prefix(t3,t1) << std::endl;
}
Si vous avez C++17, vous pouvez écrire une meilleure version de ceci, en utilisant std::string_view
à la place :
#include <string>
#include <string_view>
bool prefix(const std::string& a, const std::string& b) {
if (a.size() > b.size()) {
return std::string_view(a.c_str(),b.size()) == b;
}
else {
return std::string_view(b.c_str(),a.size()) == a;
}
}
Avec g++ 7 à -O3, cela se résume à un simple memcmp
ce qui constitue une amélioration assez substantielle par rapport à l'ancienne version.
2 votes
Et si on utilisait le bon vieux
string.compare()
?0 votes
Vous voulez dire comparer les N premiers personnages ?
0 votes
@Donotalo Ce serait bien, ce serait bien s'il le faisait pour moi afin que je n'aie pas besoin de faire de la musculation.
n
.0 votes
Eh bien, à proprement parler, une fonction qui répond à vos exigences est la fonction
==
opérateur. ;-)1 votes
@FrerichRaabe : non, il ne veut pas vérifier s'ils sont identiques, mais plutôt s'ils partagent un préfixe.
0 votes
@DavidRodríguez-dribeas : Il s'avère qu'il ne veut pas vérifier s'ils partagent un préfixe, mais si l'un est un préfixe de l'autre (j'ai reçu deux downvotes pour ne pas avoir deviné cela).
0 votes
@BjörnPollex Désolé pour les downvotes... certaines personnes sont juste trop heureuses avec le downvote, la question originale n'était pas claire, et le troisième commentaire ici semblait indiquer que....
N
était un inconnu (alors que si vous cherchez un préfixe, il est assez connu !)0 votes
@David Rodríguez - dribeas : Ma réponse pince-sans-rire visait la phrase "Existe-t-il une fonction de bibliothèque qui renverrait vrai quand on lui passe ces deux chaînes (mais faux pour disons String et OtherString) ?" dans la question. C'est pourquoi j'ai écrit le smiley à la fin ;-)
0 votes
La question était assez claire dans les exemples avant la modification qui l'a rendue explicite.
==
ne renvoie pas vrai pour 'String' et 'String:', que ce soit au sens strict ou non.0 votes
N'est-ce pas un double de (partie de) stackoverflow.com/questions/1878001/ ? La réponse à cette question est meilleure que toutes celles qui ont été données jusqu'ici.