[C++] strcmp(); !!!

strcmp(); !!! [C++] - Programmation

Marsh Posté le 12-06-2002 à 08:39:09    

/*
salut,
 
il y a un bout de temps un gars sur forum.hardware.fr avait demandé le code en C++ pour remplacer
dans un fichier une chaîne de caractère par une autre.
Les paramètres passés sont le nom du fichier, la chaîne originale, puis la nouvelle chaîne.
Voici ce que je lui ai donné, codé vite fait juste pour montrer la piste à suivre.
Seulement comme tout le monde sait, je suis une grosse bite en programmation ;-))
Donc à un moment ça coince, à la ligne où le commentaire est plutôt explicite ^_^
Quelqu'un aurait-il l'obligeance de me dire pourquoi ça marche pas, et comment résoudre le problème ?
Il m'a pas recontacté depuis, c'est juste pour ma connaissance personnelle !
 
Merci d'avance,
*/
 

Code :
  1. //------------------------------------------------
  2. ---------------------------
  3. #pragma hdrstop
  4. #include <string.h>
  5. #include <stdio.h>
  6. #include <fcntl.h>
  7. #include <io.h>
  8. //---------------------------------------------------------------------------
  9. #pragma argsused
  10. void main(int argc, char *argv[])
  11. {
  12. if (argc == 4) //faut mettre les 3 paramètres !
  13. {
  14. int oldlng = strlen(argv[2]), newlng = strlen(argv[3]);
  15. char *tmp, *tmp2 = argv[2];
  16. int fich = open(argv[1], O_RDWR | O_TEXT); //ouvre le fichier (charge en mémoire)
  17. lseek(fich, 0L, SEEK_SET); //positionne le pointeur au début du fichier (SEEK_SET)
  18. while (!eof(fich))
  19.   {
  20.   read(fich, &tmp, oldlng); //on lit
  21.   lseek(fich, -oldlng, SEEK_CUR); //on se repositionne en arrière
  22.   if (!strcmp(tmp, tmp2)) //PQ CA MARCHE PAS ???
  23.    {
  24.    write(fich, argv[3], newlng); //pas super good car si la new chaine est plus longue,
  25.    lseek(fich, newlng, SEEK_CUR); //on se repositionne à la fin     //la suite est écrasée !
  26.    }
  27.   else
  28.    lseek(fich, 1, SEEK_CUR); //on se repositionne 1 caractère plus loin
  29.   }
  30. close(fich); //on ferme ;p
  31. }
  32. }
  33. //------------------------------------------------
  34. ---------------------------


 
 
//@++
 
//juju


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 12-06-2002 à 08:39:09   

Reply

Marsh Posté le 12-06-2002 à 08:45:15    

parce que tu fait le test suivant:

Code :
  1. if (!strcmp(tmp, tmp2))
  2. // ce qui équivaut à: Si strcmp (tmp, tmp2) est FALSE, ...
  3. // FALSE, c'est 0 en fait.
  4. // Et strcmp rend les résultats suivants:
  5. // 0 si les chaines sont identiques.
  6. // Un nb > 0 si tmp > tmp2
  7. // Un nb < 0 si tmp < tmp2.
  8. // Voili.


Et ton défragmenteur !? :D

Reply

Marsh Posté le 12-06-2002 à 08:49:49    

el_gringo a écrit a écrit :

parce que tu fait le test suivant:

Code :
  1. if (!strcmp(tmp, tmp2))
  2. // ce qui équivaut à: Si strcmp (tmp, tmp2) est FALSE, ...
  3. // FALSE, c'est 0 en fait.
  4. // Et strcmp rend les résultats suivants:
  5. // 0 si les chaines sont identiques.
  6. // Un nb > 0 si tmp > tmp2
  7. // Un nb < 0 si tmp < tmp2.
  8. // Voili.


Et ton défragmenteur !? :D  




 
et merde, je voulais mettre

Code :
  1. if (strcmp(tmp, tmp2))


mais je me suis dit : "ah non je vais pas tomber dans le piège !"
 
et merde ! merci pour chou !


Message édité par juju_le_barbare le 06-12-2002 à 08:50:50

---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 12-06-2002 à 08:57:54    

juju_le_barbare a écrit a écrit :

 
 
et merde, je voulais mettre

Code :
  1. if (strcmp(tmp, tmp2))


mais je me suis dit : "ah non je vais pas tomber dans le piège !"
 
et merde ! merci pour chou !  




 
D'où l'utilité de toujours mettre le '== 0' pour être vraiement sûr de bien interpreter le résultat (ou '!= 0';) suivant ce que tu veux faire !!!
 
Certes c'est plus court quand tu mets rien ou quand tu mets '!' devant mais après tu te retrouves souvent avec des erreurs 'évitables'.


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 12-06-2002 à 09:00:39    

DarkOli a écrit a écrit :

 
 
D'où l'utilité de toujours mettre le '== 0' pour être vraiement sûr de bien interpreter le résultat (ou '!= 0';) suivant ce que tu veux faire !!!
 
Certes c'est plus court quand tu mets rien ou quand tu mets '!' devant mais après tu te retrouves souvent avec des erreurs 'évitables'.  




 :jap:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 12-06-2002 à 09:03:58    

DarkOli a écrit a écrit :

 
 
D'où l'utilité de toujours mettre le '== 0' pour être vraiement sûr de bien interpreter le résultat (ou '!= 0';) suivant ce que tu veux faire !!!
 
Certes c'est plus court quand tu mets rien ou quand tu mets '!' devant mais après tu te retrouves souvent avec des erreurs 'évitables'.  




 
Bah, quand on veut tester un int, comme ce que rend strcmp, bien sur. Mais quand on veut tester un BOOL, c 100 fois + clair de ne mettre que la velru à tester.

Reply

Marsh Posté le 12-06-2002 à 09:35:16    

Heu moi la dernière fois que j'ai mis un == 0 ou un !=0 je me suis fait jetter par mon prof :D
 
si non de toute manière c'est juste une histoire de goût après.


Message édité par LetoII le 06-12-2002 à 09:36:02

---------------
Le Tyran
Reply

Marsh Posté le 12-06-2002 à 13:05:36    

letoII a écrit a écrit :

Heu moi la dernière fois que j'ai mis un == 0 ou un !=0 je me suis fait jetter par mon prof :D
 
si non de toute manière c'est juste une histoire de goût après.  




 
oui bien c'est simple, strcmp(); renvoie un int, donc on teste avec == 0, mais pour un bool c'est true ou false.
 
Au fait je confond toujours, true c'est 0 et false c'est pas 0, ou bien c'est l'inverse ?
Je sais jamais !
 
@++
 
(put1 vous avez de la chance d'avoir un prof pour apprendre le C/C++ ... moi yen a devoir me démerder tout seul :( )


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 12-06-2002 à 13:11:34    

En C/C++ tout ce qui est différent de 0 est vrai. Par  opposition 0 est faux.


---------------
Le Tyran
Reply

Marsh Posté le 12-06-2002 à 13:29:14    

Dans le meme genre, ce soir, j'ai passé 10 mn a chercher un bug: j'utilisais une fonction de comparaison proprio a une toolkit, StrEqual, mais j'ai tellement l'habitude d'employer StrCmp que j'utilisais le test comme dans un StrCmp [:nofret]
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Marsh Posté le 12-06-2002 à 13:29:14   

Reply

Marsh Posté le 12-06-2002 à 14:03:07    

gilou a écrit a écrit :

Dans le meme genre, ce soir, j'ai passé 10 mn a chercher un bug: j'utilisais une fonction de comparaison proprio a une toolkit, StrEqual, mais j'ai tellement l'habitude d'employer StrCmp que j'utilisais le test comme dans un StrCmp [:nofret]
A+,  




 
Merci LetoII :jap:
 
Sinon gilou, 10 minutes c'est encore acceptable... Mais tu indiques bien qu'il s'agit d'une fonction propriétaire, tu l'as payée, et dis moi, ça vaut vraiment le coup ???
 
Je veux dire que en gratuit on trouve tant de bonnes fonctions ...
 
bref, @++


Message édité par juju_le_barbare le 06-12-2002 à 14:03:53

---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 12-06-2002 à 14:07:59    

gilou a écrit a écrit :

Dans le meme genre, ce soir, j'ai passé 10 mn a chercher un bug: j'utilisais une fonction de comparaison proprio a une toolkit, StrEqual, mais j'ai tellement l'habitude d'employer StrCmp que j'utilisais le test comme dans un StrCmp [:nofret]
A+,  




 
c quoi la différence entre StrCmp (fonction windows) et strcmp, si ce n'est que l'un est ANSI, l'autre non ? tu connais une raison d'utiliser StrCmp plutot que strcmp ?

Reply

Marsh Posté le 12-06-2002 à 14:09:39    

juju_le_barbare a écrit a écrit :

 
 
Merci LetoII :jap:
 
Sinon gilou, 10 minutes c'est encore acceptable... Mais tu indiques bien qu'il s'agit d'une fonction propriétaire, tu l'as payée, et dis moi, ça vaut vraiment le coup ???
 
Je veux dire que en gratuit on trouve tant de bonnes fonctions ...
 
bref, @++  




 
Ms propriétaire, ça veut pas dire qu'il l'a payée. ça veut juste dire qu'elle appartient à un librairie qui fait pas partie des fonctions standards. t'as des tas de librairies gratuites !

Reply

Marsh Posté le 12-06-2002 à 15:43:30    

el_gringo a écrit a écrit :

 
 
Ms propriétaire, ça veut pas dire qu'il l'a payée. ça veut juste dire qu'elle appartient à un librairie qui fait pas partie des fonctions standards. t'as des tas de librairies gratuites !  




 
yep t'as raison, mon amour !  :love:


---------------
Visitez mon site : http://www.jujubarbare.linux-fan.com
Reply

Marsh Posté le 13-06-2002 à 13:10:07    

el_gringo a écrit a écrit :

 
 
c quoi la différence entre StrCmp (fonction windows) et strcmp, si ce n'est que l'un est ANSI, l'autre non ? tu connais une raison d'utiliser StrCmp plutot que strcmp ?  




C'est des fonctions de l'API de mon produit, F_StrCmp ... en fait. Ca tient eventuellement compte de l'encodage des chaines (ISOLatin1, Shift-Jis, EUC, UTF-8, ...)
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- No jab ? No job ! -- (╯°□°)╯︵ ┻━┻
Reply

Sujets relatifs:

Leave a Replay

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