Probleme de strcpy ou de strcmp ?

schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008 - 26 mai 2008 à 09:54
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 26 mai 2008 à 15:58
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 ..

15 réponses

schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
26 mai 2008 à 10:03
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..
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
26 mai 2008 à 11:08
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
0
schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
26 mai 2008 à 11:32
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++;

              }

                      


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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
26 mai 2008 à 11:42
Arf encor pire, quand je cherche uniquement "1.0" ca marche ....

Je comprend vraiment pas la .. (desolé pour les 3 messages d'affilé)
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
26 mai 2008 à 11:46
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
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
26 mai 2008 à 11:48
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
0
schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
26 mai 2008 à 11:54
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..
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
26 mai 2008 à 12:56
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
0
schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
26 mai 2008 à 13:51
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)
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
26 mai 2008 à 13:54
Pas dans cette version ! le "b" indique le mode binaire or là on lit en mode texte !

Jean-François
0
schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
26 mai 2008 à 14:10
Ben etrangement, ref ne s'incremente que si je met le b (???)
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
26 mai 2008 à 14:32
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
0
schap25 Messages postés 21 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 28 mai 2008
26 mai 2008 à 15:13
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 ..)
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
26 mai 2008 à 15:58
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
0
Rejoignez-nous