Nous sommes actuellement le 12 Juil 2026, 23:19

Le fuseau horaire est UTC-5 heures [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 17 message(s) ]  Aller vers la page 1, 2  Suivant
Auteur Message
 Sujet du message: Trouver texte dans une string.
MessagePublié: 19 Déc 2003, 17:04 
Hors-ligne
Bien informé
Bien informé
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 17:40 
Hors-ligne
Toujours là!
Toujours là!
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 18:44 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 21:24 
Hors-ligne
Bien informé
Bien informé
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 21:59 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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 :wink:


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 22:09 
Hors-ligne
Modérateur
Modérateur
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 15:10
Message(s) : 3551
Localisation : Beauport, Québec
...

_________________
Procyon,
Modérateur de la section Trouvailles


Haut
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 22:24 
Hors-ligne
Bien informé
Bien informé
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 02:15
Message(s) : 1647
Localisation : Québec, Qc
essaie InStr("ababac", "abac") pour voir

Je la catch pas 8O , 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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 22:29 
Hors-ligne
Fidèle
Fidèle
Avatar de l’utilisateur

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 8O , 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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 22:30 
Hors-ligne
Toujours là!
Toujours là!
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 22:31 
Hors-ligne
Bien informé
Bien informé
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 22:37 
Hors-ligne
Bien informé
Bien informé
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 23:09 
Hors-ligne
Modérateur
Modérateur
Avatar de l’utilisateur

Inscription : 07 Jan 2002, 15:10
Message(s) : 3551
Localisation : Beauport, Québec
En retard, mais bon! :D

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 23:14 
Hors-ligne
Bien informé
Bien informé
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 19 Déc 2003, 23:29 
Hors-ligne
Modérateur
Modérateur
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
 Sujet du message:
MessagePublié: 20 Déc 2003, 00:03 
Hors-ligne
Référence
Référence
Avatar de l’utilisateur

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
 Profil  
Répondre en citant  
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 17 message(s) ]  Aller vers la page 1, 2  Suivant

Le fuseau horaire est UTC-5 heures [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 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

Recherche de:
Aller vers :  
cron
Propulsé par phpBB® Forum Software © phpBB Group
Traduction et support en françaisHébergement de site