Programme de recherche

sango06 -  
 sango06 -
Bonjour,

alors voilà autant le dire toute je commence dans le C. Et j'aimerai faire un programme qui relève tout ce qu'il y a entre 2 chaines de caracteres définie; par exemple (pris sur un autre forum: "xxx" et "yyy")

ainsi on aura à partir de ce texte : Bonjour xxx j'ai besoin yyy de xxx votre yyy aide":

j'ai besoin
votre

j'ai trouvé ça comme solution sur un autre forum mais je comprends pas en quoi ça répond au probleme:

const char *debut = strstr(chaine, "xxx" ),
*fin = strstr(chaine, "yyy" );

while ( debut && fin && debut +strlen("xxx" ) < fin )
{
/* faire joujou avec la chaine trouvee */

debut = strstr(fin+strlen(fin), "xxx" );
fin = strstr(fin+strlen(fin), "yyy" );
}

merci d'avance pour votre aide

2 réponses

mamiemando Messages postés 34250 Date d'inscription   Statut Modérateur Dernière intervention   7 901
 
Lorsque tu cherches à comprendre le fonctionnement d'une fonction de la lib c, par exemple "strstr" il suffit de taper dans google (ou dans une console si tu es sous linux) "man strstr" :
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strstr.3.html

Dans le morceau de code que tu as copié collé, debut et fin valent NULL si la recherche du motif (respectivement "xxx" et "yyy") n'a rien donné, ce qui empêchera de (re)rentrer dans la boucle while qui suit (test debut && fin). Note qu'on aurait pu écrire "debut != NULL && fin != NULL" mais en C, tout ce qui n'est ni NULL, ni 0 est considéré comme vrai. En l'occurrence, debut et fin sont deux pointeurs (des adresses mémoires) qui ne valent NULL que si strstr n'a rien trouvé.

Le troisième test 'debut +strlen("xxx" ) < fin' sert à vérifier qu'il reste encore suffisamment de caractères dans la chaîne pour espérer trouver "xxx". Comme "yyy" fait le même longueur la personne qui a écrit le programme a omis de mettre 'debut +strlen("yyy" ) < fin'. Je ne suis cependant pas persuadée que ce test soit nécessaire pour que le programme se déroule bien, ou qu'il optimise quelque chose.

Une fois rentré dans la boucle on peut manipuler le tronçon de chaîne compris entre debut et fin, qui correspond au morceau entre "xxx" et "yyy".

La boucle while se répète tant que des tronçons xxx...yyy sont trouvés, puis le programme se poursuit.

Bonne chance
1
sango06
 
Bonjour merci d'avoir répondu,

mais dans la boucle , par exemple j'aimerai qu'il donne ce qu'il trouve entre xxx et yyy.
Comment faire : printf("%s",???);


merci
0
mamiemando Messages postés 34250 Date d'inscription   Statut Modérateur Dernière intervention   7 901
 
En cherchant un tout petit peu sur google :
https://c.developpez.com/telecharger/#STRING_sous_chaine

Autre possibilité à tester (mieux puisqu'elle évite de faire une recopie de la sous-chaîne) :
const char *p;
for(p=debut;p!=fin;++p) printf("%c",*p);

(ou quelque chose dans ce goût-là).

Bonne chance
0
sango06
 
Bonjour, vraiment merci pour votre aide

alors j'ai ca: int main(int argc, char *argv[])
{
const char *debut = strstr("Texte de test bonjour test Texte de test bonjour test", "exte");
const char *fin = strstr("Texte de test bonjour test Texte de test bonjour test", "our");
const char *p;

while ( debut != NULL && fin != NULL )
{

for(p=debut;p!=fin;++p) printf("%c",*p);
debut = strstr(fin+strlen(fin), "exte" );// ici je comprend pas à quoi ca sert
fin = strstr(fin+strlen(fin), "our" );// de meme ici

}


return 0;


je comprends pas trop à quoi servent les 2 lignes signalées dans le code et par contre j'ai un souci au niveau des répétition, exemple ici je vais avoir:

"exte de test bonj" alors que ce que je veux c'est :" de test bonj"
et si il est plusieurs fois dans le texte ça n'apparait pas.


merci
0