| |
Consulter les messages sans réponse | Consulter les sujets actifs
| Auteur |
Message |
|
Michel Chamberland
|
Publié: 19 Déc 2003, 17:04 |
|
Inscription : 07 Jan 2002, 02:15 Message(s) : 1647 Localisation : Québec, Qc
|
|
Je vais surement me programmer un jeu vidéo en C++ avec directx bientôt ( j'ai commencé à faire mes outils ).
Dans mon jeu je désire inclure des cheats codes, exemple:
Pendant le jeu, si je tape "addlife" il va m'ajouter une vie à ma variables vie.
J'aimerais savoir ( je n'ai pas trouvé ) si parmis la gamme énorme des fonctions disponibles ( strncopy, strnlen, strcap, etc, etc ) si il n'existerait pas une fonction tout faites style:
bool Trouve (char * Buffer, "addlife");
Buffer étant les caractères tapé par l'utilisateur et la partie à trouver. Si trouvé sa retourne TRUE.
En sql c'est pas compliqué ya le mots LIKE, mais en C++ je sais pas.
Je pourrais le faire moi même avec un petit parcours de la string avec un compteur mais si il y en une déjà toute faites et optimisé j'aimerais bien.
|
|
| Haut |
|
 |
|
cro
|
Publié: 19 Déc 2003, 17:40 |
|
Inscription : 08 Jan 2002, 14:51 Message(s) : 1337 Localisation : Québec
|
Avec la classe C++ string, tu peux utiliser la méthode find.
Code : #include <iostream> using namespace std;
int main() { string str("Hello, world");
int nIndex = str.find("world"); if (nIndex!= -1) { cout << "string found at index " << nIndex<< endl; } else { cout << "string not found" << endl; } }
|
|
| Haut |
|
 |
|
jonat
|
Publié: 19 Déc 2003, 18:44 |
|
Inscription : 27 Juin 2002, 21:39 Message(s) : 880
|
Code : #include <string.h>
char *strstr(const char *s1, const char *s2);
C'est la fonction "strstr" de string.h
C'est ce que vous cherchiez?
_________________ Spécialisation : Sécurité informatique & Téléphonie mobile
|
|
| Haut |
|
 |
|
Michel Chamberland
|
Publié: 19 Déc 2003, 21:24 |
|
Inscription : 07 Jan 2002, 02:15 Message(s) : 1647 Localisation : Québec, Qc
|
|
Zuttttttt. Je suis toujours trop vite.
Merci de votre aide, j'avais été voir si il y avait des réponse à ma question et comme il y en avait pas jel'ai programmé moi même et entre temps vous avez répondu à ma question ( mauvais timing )
Je vrois que je vais garder ma fonction, elle fonctionne bien.
Comme c'est un forum d'entraide d'une certaine facon, je me sent généreux voici mon code:
Exemple d'appel de la fonction
if (InStr ("Michel est le meilleur programmeur que je connait", "est le m"))
{
DDText(lpDDSBack, "Mot trouvé.",20, 100, RGB(255,0,0));
}
else
{
DDText(lpDDSBack, "Mot non trouvé.",20, 100, RGB(255,0,0));
}
Fonction en elle même
/****************************************************************************
Retourne TRUE si ATrouver est dans Texte.
****************************************************************************/
bool InStr (char * Texte, char * ATrouver)
{
int Len_Texte, Compteur_Texte;
int Len_ATrouver, Compteur_ATrouver = 0;
int Hit_Bon_De_Suite = 0;
Len_Texte = strlen(Texte);
Len_ATrouver = strlen(ATrouver);
for (Compteur_Texte=0;Compteur_Texte<Len_Texte;Compteur_Texte++)
{
if (ATrouver[Compteur_ATrouver]==Texte[Compteur_Texte])
{
Hit_Bon_De_Suite++;
Compteur_ATrouver++;
if (Hit_Bon_De_Suite==Len_ATrouver)
{
return (TRUE);
}
}
else
{
Hit_Bon_De_Suite=0;
Compteur_ATrouver=0;
}
}
return (FALSE);
}
|
|
| Haut |
|
 |
|
Auron
|
Publié: 19 Déc 2003, 21:59 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
Michel Chamberland a écrit: Zuttttttt. Je suis toujours trop vite.
Merci de votre aide, j'avais été voir si il y avait des réponse à ma question et comme il y en avait pas jel'ai programmé moi même et entre temps vous avez répondu à ma question ( mauvais timing )
Je vrois que je vais garder ma fonction, elle fonctionne bien. Comme c'est un forum d'entraide d'une certaine facon, je me sent généreux voici mon code:
Exemple d'appel de la fonction
if (InStr ("Michel est le meilleur programmeur que je connait", "est le m")) { DDText(lpDDSBack, "Mot trouvé.",20, 100, RGB(255,0,0)); } else { DDText(lpDDSBack, "Mot non trouvé.",20, 100, RGB(255,0,0)); }
Fonction en elle même
/**************************************************************************** Retourne TRUE si ATrouver est dans Texte. ****************************************************************************/ bool InStr (char * Texte, char * ATrouver) { int Len_Texte, Compteur_Texte; int Len_ATrouver, Compteur_ATrouver = 0; int Hit_Bon_De_Suite = 0;
Len_Texte = strlen(Texte); Len_ATrouver = strlen(ATrouver);
for (Compteur_Texte=0;Compteur_Texte<Len_Texte;Compteur_Texte++) { if (ATrouver[Compteur_ATrouver]==Texte[Compteur_Texte]) { Hit_Bon_De_Suite++; Compteur_ATrouver++; if (Hit_Bon_De_Suite==Len_ATrouver) { return (TRUE); } } else { Hit_Bon_De_Suite=0; Compteur_ATrouver=0; } } return (FALSE); }
essaie InStr("ababac", "abac") pour voir 
|
|
| Haut |
|
 |
|
Procyon
|
Publié: 19 Déc 2003, 22:09 |
|
Inscription : 07 Jan 2002, 15:10 Message(s) : 3551 Localisation : Beauport, Québec
|
|
...
_________________ Procyon,
Modérateur de la section Trouvailles
|
|
| Haut |
|
 |
|
Michel Chamberland
|
Publié: 19 Déc 2003, 22:24 |
|
Inscription : 07 Jan 2002, 02:15 Message(s) : 1647 Localisation : Québec, Qc
|
essaie InStr("ababac", "abac") pour voir
Je la catch pas  , pourquoi ca me dit non trouvé avec cet exemple, as tu une explication?
Edit:
ok je viens de comprendre, il ne reprend pas du recul sur le texte, c'est rare comme exeption surtout dans du texte de tout les jour, mais l'erreur est la.
Dernière édition par Michel Chamberland le 19 Déc 2003, 22:30, édité 1 fois.
|
|
| Haut |
|
 |
|
Auron
|
Publié: 19 Déc 2003, 22:29 |
|
Inscription : 22 Fév 2002, 20:54 Message(s) : 738 Localisation : Montréal
|
Michel Chamberland a écrit: essaie InStr("ababac", "abac") pour voir Je la catch pas  , pourquoi ca me dit non trouvé avec cet exemple, as tu une explication?
aba match, l'algo continue au deuxième b quand il se rend compte que b ne match pas avec c.
tu devrais continuer au premier b
|
|
| Haut |
|
 |
|
cro
|
Publié: 19 Déc 2003, 22:30 |
|
Inscription : 08 Jan 2002, 14:51 Message(s) : 1337 Localisation : Québec
|
Citer: essaie InStr("ababac", "abac") pour voir
C'est l'avantage de la fonction find.
Code : int nIndex, nNbr = 0; string str("abacabac");
nIndex = str.find("abac"); while (nIndex != -1); { ++nNbr; nIndex = str.find("abac", nIndex + 1); } cout << "abac was found " << nNbr << " times." << endl;
Michel pourrait facilement modifier sa fonction pour le faire aussi, mais pourquoi tout refaire quand le C++ le fait déjà très bien.
Dernière édition par cro le 19 Déc 2003, 22:55, édité 2 fois.
|
|
| Haut |
|
 |
|
Michel Chamberland
|
Publié: 19 Déc 2003, 22:31 |
|
Inscription : 07 Jan 2002, 02:15 Message(s) : 1647 Localisation : Québec, Qc
|
|
ok je viens de comprendre, il ne reprend pas du recul sur le texte, c'est rare comme exeption surtout dans du texte de tout les jour, mais l'erreur est la.
|
|
| Haut |
|
 |
|
Michel Chamberland
|
Publié: 19 Déc 2003, 22:37 |
|
Inscription : 07 Jan 2002, 02:15 Message(s) : 1647 Localisation : Québec, Qc
|
cro a écrit: Citer: essaie InStr("ababac", "abac") pour voir C'est l''avantage de la fonction find. Code : int nIndex, nNbr = 0; string str("abacabac");
nIndex = str.find("abac"); while (nIndex != -1); { ++nNbr; nIndex = str.find("abac"); } cout << "abac was found " << nNbr << " times." << endl;
Michel pourrait facilement modifier sa fonction pour le faire aussi, mais pourquoi tout refaire quand le C++ le fait déjà très bien.
Ta raison pourquoi inventer la roue quand elle est déjà fonctionnel.
Et j'y pense mêmepas besoin de fonction, une ligne et le tour est joué.
|
|
| Haut |
|
 |
|
Procyon
|
Publié: 19 Déc 2003, 23:09 |
|
Inscription : 07 Jan 2002, 15:10 Message(s) : 3551 Localisation : Beauport, Québec
|
En retard, mais bon!
C'est mieux d'utiliser strstr() ou string.find() quand même...
Code : int instr(char *source, char *stext) { int i; for (i = 0; source[i] != '\x0'; i++) { int x = i; while (source[x] == stext[x-i] && source[x] != '\x0') { x++; } if (stext[x-i] == '\x0') return i; } return -1; }
si le texte est trouvé, ça donne la position de celui-ci, sinon la fonction retourne -1. Ça me donne le goût de recommencer à faire du C/C¨++! 
_________________ Procyon,
Modérateur de la section Trouvailles
|
|
| Haut |
|
 |
|
Michel Chamberland
|
Publié: 19 Déc 2003, 23:14 |
|
Inscription : 07 Jan 2002, 02:15 Message(s) : 1647 Localisation : Québec, Qc
|
|
Question de bien faire ma job et me couché l'ame en paix, j'ai modifié ma fonction pour le fun, je crois que c'est la bonne. Si quelqu'un dans cette pièce crois le contraire levez-vous.
/****************************************************************************
Retourne TRUE si ATrouver est dans Texte.
****************************************************************************/
bool InStr (char * Texte, char * ATrouver)
{
int Len_Texte, Compteur_Texte;
int Len_ATrouver, Compteur_ATrouver = 0;
int Hit_Bon_De_Suite = 0;
int Retour;
Len_Texte = strlen(Texte);
Len_ATrouver = strlen(ATrouver);
for (Compteur_Texte=0;Compteur_Texte<Len_Texte;Compteur_Texte++)
{
if (ATrouver[Compteur_ATrouver]==Texte[Compteur_Texte])
{
if (Hit_Bon_De_Suite==1) Retour=Compteur_Texte+1;
Hit_Bon_De_Suite++;
Compteur_ATrouver++;
if (Hit_Bon_De_Suite==Len_ATrouver)
{
return (TRUE);
}
}
else
{
if (Hit_Bon_De_Suite!=0) Compteur_Texte=Retour;
Hit_Bon_De_Suite=0;
Compteur_ATrouver=0;
}
}
return (FALSE);
}
|
|
| Haut |
|
 |
|
Procyon
|
Publié: 19 Déc 2003, 23:29 |
|
Inscription : 07 Jan 2002, 15:10 Message(s) : 3551 Localisation : Beauport, Québec
|
Désolé de te l'annoncer, mais ça ne fonctionne pas!
Essaye ceci:
InStr("ABCDBDE", "BD");
_________________ Procyon,
Modérateur de la section Trouvailles
|
|
| Haut |
|
 |
|
JEDI JF
|
Publié: 20 Déc 2003, 00:03 |
|
Inscription : 30 Juil 2002, 20:04 Message(s) : 5314 Localisation : Longueuil (l'original)
|
|
Je crois que pour ce problème le meilleur algorithme est de commencer la recherche par la fin de la chaîne de caractères à trouver. Comme ça, ça t'évite de comparer toutes les lettres de la grande chaîne. La méthode "brute" va donner une complexité dans l'ordre O(taille grande chaîne * taille chaîne à trouver). Bon c'est sûr que c'est l'ordre max, ce n'est pas l'ordre exact mais ce n'est pas négligeable.
Donc tu commences par la dernière lettre de la chaîne à trouver. Tu te positionnes à la "longueur de la chaîne à trouver" dans la grand chaîne. Si c'est la bonne lettre, tu recules pour vérifier les lettres d'avant jusqu'au début. Si tu trouves une mauvaise lettre, tu peux t'avancer dans le meilleur cas de la longueur de la chaîne à trouver ou jusqu'à ce qu'une lettre dans ta chaîne à trouver soit dans la grande chaîne avant.
Pour plus de détails regarde l'algorithme de Knuth-Morris-Pratt. Ça va te donner à la place une complexité de l'ordre O(taille grande chaîne + taille chaîne à trouver) je crois.
Et sérieusement, l'ordre de complexité n'est vraiment pas à négliger, peu importe la vitesse de la machine (mais bon, il ne faut pas oublier les constantes multiplicatives cachées).
_________________ intel E7300 @ 3.8Ghz (9.5x400) Asus P5Q Pro // Diamond Radeon 4870 1 gig // 4 PC2-8500 OCZ XTC Platinum // OCZ Vendetta 2 + Xigmatek ACK-I7751 // Western Digital Caviar Black 640GB // Corsair TX750W // Antec 900
|
|
| Haut |
|
 |
Qui est en ligne ? |
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s) |
|
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum
|
|
|
|