Probleme de strcpy ou de strcmp ?

Signaler
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
Bonjour,

J'ai un petit soucis, je cherche a comparé deux chaine de caractère donc je commence par faire :

strcpy(mot,"MIME-Version: 1.0 ");

Le deuxieme mot est recherché caractere par caractere dans un texte afin d'y etre comparé

donc plus loin je fais :

if(!(strcmp(s_read,mot)))

 {

blabla++;

 }


En gros, j'ai l'impression que le code ne prend pas en compte le ".0"
pour faire la comparaison, et donc je ne rentre jamais dans le if,
malgré que s_read soit identique a mot (normalement), car quand je
compare seulement avec "MIME-Version", ca fonctionne .. (c'est pour un
code de recherche de mot dans un fichier txt).

Si quelqu'un pouvai m'aider ..
A voir également:

15 réponses

Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

Pardon, je viens de voir que strcmp s'arretai au premier 0 trouvé, je
sais donc d'ou vien le probleme, mais je ne vois pas quel fonction je
doit utilisé pour remplacé strcmp..
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

1) Il ne faut pas confondre le caractère "0" (zéro) avec le code binaire 0 qui marque la fin d'une chaîne ! Le contenu de la chaîne "mot" peut contenir autant de caractères "0" que possible, ça n'arrêtera pas la comparaison.

2) Il y a un espace derrière le "0" dans le code strcpy(mot,"MIME-Version: 1.0 ");. S'il n'existe pas aussi dans s_read, la comparaison sera toujours négative !

Jean-François
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

Ah oki, donc le mystere est encor plus grand XD

La recherche marche quand je cherche "Mime-Version 1" mais ne marche pas avec "Mime-Version 1." ou "1.0"

Mon code c'est un peu près ca (d'après une source trouvé sur ce site, très legerement modifier)


 while(!feof(file))

             {

             n=getw(file);

             l_file++;

             }

         //On multiplie par 4 pour obtenir le nombre d'octets

         l_file=l_file*4;

         //On ferme

         fclose(file);

         //Ouverture en ASCII

         file=fopen(file_t,"r");

         cout<<"Le
fichier existe et contient "<<l_file<<" caractère
"<<endl;

    }


     for (t=0;t<=(l_file-l_mot);t++)

         {    

                                          


         //On place le pointeur à la position t (initialement nulle puis incrémentée)

        
fseek(file,t,0);                                 


         //On récupère l_mot caractères à partir de cette position

         //(autant de caractères que de caractères dans le mot)

         //Attention, le
deuxième argument est 'l_mot+1' pour récupérer l_mot caractères !

      

         fgets(s_read,l_mot+1,file); 

        

         //Si les chaînes mot et s_read sont identiques

          if(!(strncmp(s_read,mot,strlen(mot))))

              {

             
//On incrémente alors ref (qui contient le nombre de chaînes identiques
trouvées)

              ref++;

              }

                      


         }
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

ps : le probleme peut-il venir du point ?
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

Arf encor pire, quand je cherche uniquement "1.0" ca marche ....

Je comprend vraiment pas la .. (desolé pour les 3 messages d'affilé)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Certainement pas ! Seul le zéro binaire stoppe la comparaison. Est-ce qu'il n'y aurait pas un problème de casse (majuscules/minuscules) ? stricmp() pour ne pas tenir compte de la casse.

Jean-François
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
19 novembre 2020
93
Salut,
Une petite précision concernant les fonctions de comparaison: elles sont case-sensitives. Pour ne pas prendre en compte les majuscules et miniscules, il faut utiliser stricmp()

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

Merci a vous !

J'ai trouvé la solution ... vraiment bete ...

L'erreur venait seulement du fait que j'avai initialisé mot comme ca ..

char mot[16];

strcpy(mot,"MIME-Version: 1.0");


Et "Mime-version: 1.0" ca fai + de 16 caractere ... *sigh* vraiment desolé .. ca m'apprendra..
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

En tout cas c'est une manipulation de fichier qui est extrèmement bizarre !!! - Une première lecture pour connaître la taille du fichier via la lecture d'entiers : getw() lit un "int" 4 octets 4 caractères, donc une taille de fichier fausse 3 fois sur 4 (le fichier n'a aucune raison d'avoir une taille systématiquement multiple de 4).
 - Une seconde lecture qui lit des blocs de caractères en se décallant d'un caractère à chaque fois : si "l_mot" = 18 caractères, grosso-modo le fichier est lu 18 fois !

Comme c'est un fichier texte vu l'open("r") il suffit de faire (si la sous-chaîne n'est sensée être trouvée qu'une seule fois par ligne) :

l_file = 0; // si besoin de la taille du fichier par la suite
ref = 0;
char* szMot = "MIME-Version: 1.0";
FILE* pFile = fopen(file_t,"r");
if (pFile == NULL) return; // ERREUR
char szLigne[1024]; // buffer de lecture d'une ligne
while(true)
{
   if (fgets(szLigne,1024,pFile) == NULL) break; // EOF
   l_file += strlen(szLigne) + 1; // +1 pour NL
   if (strstr(szLigne,szMot)) ++ref;
}
fclose(pFile);
cout << szMot << " trouvé " << ref << " fois" << endl;

Jean-François
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

C'est vrai que c'est plus simple et plus rapide d'execution ! merci !

Mais je doit faire
FILE* pFile = fopen(file_t,"rb");

et non FILE* pFile fopen(file_t,"r"); pour que ca fonctionne)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Pas dans cette version ! le "b" indique le mode binaire or là on lit en mode texte !

Jean-François
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

Ben etrangement, ref ne s'incremente que si je met le b (???)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

C'est pas normal que cela ne marche pas avec "r" seul (ou "rt").
 
Je viens de tester et ça marche bien avec ou sans le "b" puisque fgets() lit jusqu'au premier NL rencontré, donc il lit bien le fichier ligne par ligne. Par contre avec le "b" la taille du fichier est fausse (il ne faut plus le + 1).

Jean-François
Messages postés
21
Date d'inscription
mercredi 21 mai 2008
Statut
Membre
Dernière intervention
28 mai 2008

Merci pour ton aide Jfrancois, mon programme fonctionne ... mais est beaucoups trops long a l'execution :'(

(je devais rechercher le nombre de fois qu'apparaissai un mot dans un
ensemble de fichier de 4 a 10Go, afin de compter un nombre de mails,
fin bref ..)
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Alors il faudrait limiter les accès disque en lisant les fichiers par gros blocs, mais on court le risque (très faible mais pas nul) du texte coupé en 2 entre 2 blocs. Ou alors lire les fichiers en une seule fois s'il ne sont pas trop gros individuellement. Ensuite c'est de la recherche en mémoire.

Jean-François