Comparer deux string

Fermé
Onur78 Messages postés 27 Date d'inscription dimanche 19 septembre 2010 Statut Membre Dernière intervention 6 juin 2014 - 5 janv. 2013 à 20:03
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 6 janv. 2013 à 13:34
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 :
        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 :) )

3 réponses

j'aime pas les pseudo
6 janv. 2013 à 10:47
Salut,
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/
@++
0
Onur78 Messages postés 27 Date d'inscription dimanche 19 septembre 2010 Statut Membre Dernière intervention 6 juin 2014 5
Modifié par Onur78 le 6/01/2013 à 10:53
J'ai finalement trouvé la réponse moi même ^^ en cherchant.. cherchant et cherchant....

  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
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
Modifié par mamiemando le 6/01/2013 à 13:41
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 ==.

#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
0