Comparer deux string
Bonsoir à tous,
J'ai appris les bases du C++ (avec le tuto à Mathéo du site du zero) il y a seulement une semaine.
Je me suis mis à programmer (à modifier) les sources d'un jeu, pour faire mon propre serveur.
Étant trop débutant (malheureusement) je ne maitrises pas encore assez bien certaines choses. J'ai réussi à comparer deux début de texte, mais seulement voilà, c'est à exactitude, et ce, même avec la casse..
Petit exemple de code :
Vous l'aurez bien comprit, en tapant /playercmds le joueur voit apparaitre quelque indications.
Le problème est que, si il tape /Playercmds, cela ne fonctionne pas.
Comme le dit le titre de ce poste, ma question est de comparér deux string, soit, ma question n'est en réalité pas "comment ignorer la casse" donc je vous donne un exemple de ce que j'ai réélement besoin.
Ce code kick tout joueur qui écrit "Onur noob" en lui disant que c'est lui le noob. Le problème c'est que, si ils écrivent "onur noob" ou encore "Hi Onur noob" ils ne seront pas kick, le serveur ne cherche que le début de la phrase..
J'espère avoir été assez clair sur ces deux problèmes ^^
Merci d'avance pour toutes vos réponses (utile :) )
J'ai appris les bases du C++ (avec le tuto à Mathéo du site du zero) il y a seulement une semaine.
Je me suis mis à programmer (à modifier) les sources d'un jeu, pour faire mon propre serveur.
Étant trop débutant (malheureusement) je ne maitrises pas encore assez bien certaines choses. J'ai réussi à comparer deux début de texte, mais seulement voilà, c'est à exactitude, et ce, même avec la casse..
Petit exemple de code :
else if(!str_comp(pMsg->m_pMessage, "/playercmds")) { SendChatTarget (ClientID, "~~~~~~~~PLAYERCMDS~~~~~~~~"); SendChatTarget (ClientID, "/exshotgun - Enable the explosive shotgun"); }
Vous l'aurez bien comprit, en tapant /playercmds le joueur voit apparaitre quelque indications.
Le problème est que, si il tape /Playercmds, cela ne fonctionne pas.
Comme le dit le titre de ce poste, ma question est de comparér deux string, soit, ma question n'est en réalité pas "comment ignorer la casse" donc je vous donne un exemple de ce que j'ai réélement besoin.
else if(!str_comp(pMsg->m_pMessage, "Onur noob")) { Server()->Kick(ClientID, "You are the noob"); }
Ce code kick tout joueur qui écrit "Onur noob" en lui disant que c'est lui le noob. Le problème c'est que, si ils écrivent "onur noob" ou encore "Hi Onur noob" ils ne seront pas kick, le serveur ne cherche que le début de la phrase..
J'espère avoir été assez clair sur ces deux problèmes ^^
Merci d'avance pour toutes vos réponses (utile :) )
A voir également:
- Comparer deux string c++
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Nombre de jours entre deux dates excel - Guide
- Deux whatsapp sur un téléphone - Guide
- Connecter deux airpods mac - Guide
3 réponses
Salut,
je suis pas un grand expert c++,
mais tu pourrais t'inspirer de ceci:
et un petit lien utile!! ;)
http://www.cplusplus.com/reference/string/string/string/
@++
je suis pas un grand expert c++,
mais tu pourrais t'inspirer de ceci:
string StringToUpper(string mot){ string res; int i; for(i = 0;i<mot.size();i++){ res+=toupper(mot.at(i)); } return res; } bool compareText(string mot,string text){ string MOT= StringToUpper(mot); string TEXT=StringToUpper(text); return MOT.find(TEXT) != string::npos; } int main() { string str = "Hi Onur noob"; if(compareText(str,"Onu noob")) cout << "You are the noob" << endl; else cout << "Erreur" << endl; return 0; }
et un petit lien utile!! ;)
http://www.cplusplus.com/reference/string/string/string/
@++
J'ai finalement trouvé la réponse moi même ^^ en cherchant.. cherchant et cherchant....
find pour dire de trouver, et nocase pour ignorer la casse. J'espère que ça aideras certaines personnes, je n'ai pas trouvé sur CCM
else if(str_find_nocase(pMsg->m_pMessage, "onur noob")) { Server()->Kick(ClientID, "You are the noob"); }
find pour dire de trouver, et nocase pour ignorer la casse. J'espère que ça aideras certaines personnes, je n'ai pas trouvé sur CCM
En C++ tu peux par exemple écrire une fonction to_lower qui calcule la chaîne écrite en minuscule. Ensuite il suffit d'utiliser l'opérateur ==.
.. ou encore coder directement la fonction de comparaison :
Sortie :
Bonne chance
#include <string> #include <iostream> #include <algorithm> std::string to_lower(const std::string & sin) { std::string s(sin); std::transform(s.begin(), s.end(), s.begin(), ::tolower); return s; } int main() { std::string s1 = "TotO"; std::string s2 = "TOTO"; if (to_lower(s1) == to_lower(s2)) { std::cout << "s1 = " << s1 << " <=> s2 = " << s2 << std::endl; } return 0; }
.. ou encore coder directement la fonction de comparaison :
#include <string> #include <iostream> bool stricmp(const std::string & s1, const std::string & s2) { std::string::const_iterator s1_it (s1.begin()), s1_end(s1.end()), s2_it (s2.begin()), s2_end(s2.end()); for(; s1_it != s1_end && s2_it != s2_end; ++s1_it, ++s2_it) { if (tolower(*s1_it) != tolower(*s2_it)) return false; } return s1_it == s1_end && s2_it == s2_end; } int main(){ std::string s1 = "TotO"; std::string s2 = "ToTO"; if (stricmp(s1, s2)) { std::cout << "s1 = " << s1 << " <=> s2 = " << s2 << std::endl; } return 0; }
Sortie :
s1 = TotO <=> s2 = TOTO
Bonne chance