[C] Problème avec strstr

Problème avec strstr [C] - Programmation

Marsh Posté le 25-05-2002 à 17:30:14    

Salut à tous !
 
J'ai un petit problème avec la fonction strstr().
 
En effet, après avoir récupéré des chaines avec la fonction fgets (ce qui me permet d'avoir des chaines contenant des espaces), j'essaye de trouver si la chaine rentrée contient une autre chaine.
 
Exemple :
l'utilisateur rentre "le seigneur des anneaux" et apres il rentre "seigneur" et le programme devrait retourner un TRUE car la chaine contient effectivement ce mot.
 
Mon problème, c'est que si l'utilisateur tape "seigneur" ca ne marche pas, mais par contre "anneaux" marchera.
J'ai fait des tests et il apparait que seul le dernier mot de la phrase peut etre trouvé.
 
Quelqu'un aurait une explication et/ou un moyen de pouvoir résoudre ce petit problème ?
 
Merci d'avance
 
Yann


---------------
“You want weapons? We’re in a library! Books! The best weapons in the world!”
Reply

Marsh Posté le 25-05-2002 à 17:30:14   

Reply

Marsh Posté le 25-05-2002 à 17:33:48    

soit plus précis / montre ton code, ça a tout l'air d'être un bug SS (simple & sournois).

Reply

Marsh Posté le 25-05-2002 à 17:40:27    

Dans ma classe j'ai surchargé l'opérateur >> :
 
istream &operator>>(istream &stream, livre &bouquin)
 {
   printf("Entrez le titre : " );
   fgets(bouquin.titre,128,stdin);
 
   return stream;
 }
 
 
titre est un char[128];
 
 
après je teste :
 
printf(debut->get_contenu().get_titre());
//affiche "le seigneur des anneaux"
 
printf(rech);
//affiche "seigneur"
 
if(strstr(debut->get_contenu().get_titre(),rech)!=
NULL)
{
 res[i]=*debut;
 i++;
}
 
 
et mon tableau res ne contient aucun resultat.
Par contre, si je mets "anneaux" comme deuxième string, le tableau res ne sera pas vide.
 
 
bon tout ca se passe dans une liste chaînée alors je vous mets pas tout :)
Toujours est-il que le prog affiche les bonnes strings mais ne voit pas si la deuxieme est contenue dans la première à moins que celle-ci soit la dernière partie de la première.


---------------
“You want weapons? We’re in a library! Books! The best weapons in the world!”
Reply

Marsh Posté le 25-05-2002 à 17:48:22    

ça m'a l'air bien compliqué ton truc ...
 
c'est quoi  
 
{  
res[i]=*debut;  
i++;  
}  
 
?
 
et que veux-tu faire au juste ? ce n'est pas un problème de strstr() mais plutôt dans la conception de ton programme.
 
car un truc genre :
 
char* str = "le seigneur des anneaux";
char* search = strstr(str, "seigneur" );
 
te renverra bien un pointeur non nul.

Reply

Marsh Posté le 25-05-2002 à 17:56:34    

Mon programme c'est une médiathèque  :D  
 
{  
res[i]=*debut;  
i++;  
}  
 
ca sert à stocker les dix premiers résultats qui contienent le mot rechercher par un utilisateur.
 
tous mes livres sont stockés dans un fichier. Je les extrait ensuite et j'en fait une liste chaînée. Cette liste est parcourue du premier au dernier élément.
L'utilisateur rentre un mot et le prog doit sortir les livres dont le titre contiennent ce mot.
 
c'est pourquoi je recherche le mot entré par l'utilisateur dans le titre du livre (un objet de classe livre).
 
Je pense que le problème vient des espaces, je vais essayer de les supprimer avant de faire le test


---------------
“You want weapons? We’re in a library! Books! The best weapons in the world!”
Reply

Marsh Posté le 25-05-2002 à 18:00:15    

:D
 
montre plus de code, parce que là ...

Reply

Marsh Posté le 25-05-2002 à 18:12:27    

Hou, je crois savoir d'où vient le problème :
chaine1 <- "le seigneur des anneaux\n"
rech <- "seigneur\n"
 
strstr(chaine1,rech) -> NULL c'est évident ! (problème avec les \n !)  
Tout dépend de la manière dont tu récupère tes chaînes, mais elle ne doivent pas être constitués de '\n' et se terminer obligatoirement par '\0'...


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 25-05-2002 à 18:15:16    

Je récupère mes chaines avec un fgets sur stdin.
 
Tu saurais comment faire pour palier ce problème ?
 
J'ai essayé d'ajouter \0 à la fin , mais sans plus de succès


---------------
“You want weapons? We’re in a library! Books! The best weapons in the world!”
Reply

Marsh Posté le 25-05-2002 à 18:22:03    

char *cr_ptr;
 
if ((cr_ptr = strchr(chaine1,'\n';))!=NULL) {
    *cr_ptr = '\0';
}
 
ça devrait marcher...
 
Mais si tu récupère ta chaine 'rech' par un fgets, fait plutôt un sscanf par la suite, pour éviter les "isspace" caractères :
 
char temp[BUFSIZ];
sscanf(rech,"%s",temp);
strcpy(rech,temp);


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed