C++

Fermé
islanmao Messages postés 1 Date d'inscription samedi 27 septembre 2003 Statut Membre Dernière intervention 22 février 2005 - 22 févr. 2005 à 09:42
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 - 21 avril 2005 à 12:01
Bonjour,
en C++ cela veut dire quoi?
if ((strcmp(wData.cFileName, ".."))&&((strcmp(wData.cFileName, "."))))

avec wData un WIN32_FIND_DATA??

Merci :))

15 réponses

Canard007 Messages postés 5929 Date d'inscription mercredi 26 mai 2004 Statut Contributeur Dernière intervention 18 septembre 2009 215
22 févr. 2005 à 09:58
strcmp compare 2 chaine de caracte donc le test la compare
wData.cFileName avec . et ..
et si c est egal a l'un des 2 tu rentres dans le if.
pour WIN32_FIND_DATA je ne saurai te dire mais a mon avis tu trouvera la reponse sur msdn
0
Bonjour,
WIN32_FIND_DATA est une structure contenant des informations sur les répertoires et fichiers d'un volume, elle est utilisée dans une boucle de lecture des entrées d'un répertoire, d'où le test strcmp qui vérifie s'il s'agit du répertoire parent ou lui-même.
0
Jerry21 Messages postés 104 Date d'inscription mercredi 10 avril 2002 Statut Membre Dernière intervention 8 juin 2008 25
30 mars 2005 à 20:51
J'ai quelques questions envers la fonction strcmp().
Est-ce possible de comparer deux tableau de caractère?
exemple:

strcmp(tab[10],tab[10]);

if (strcmp()==1)
{
cout<<" les deux tableaux sont différents "<<endl;
}
else
cout<< " les deux tableaux sont identiques " <<endl;


bien entendu j'ai essayer de compiler , mais toujours un msg d'erreur me disant que j'essais de comparer un type de chaine différent. Pouvez vous m'aider stp.



0
Jerry21 Messages postés 104 Date d'inscription mercredi 10 avril 2002 Statut Membre Dernière intervention 8 juin 2008 25
30 mars 2005 à 21:07
//Voici le code au complet pour simplifier l'analyse
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;

char test1;
char test2;
int resultat;


main()
{

cout << " Entrez le nombre de caractère1 : ";
test1=getchar();

cout <<" Entrez le nombre de caractère2 : ";
test2=getchar();

resultat=strcmp(test2,test1);


if (resultat==1)
{
cout << " les deux tableau sont différentes "<< endl;

}
else
{
cout << " les deux tableaux sont identiques "<< endl;
}
}// fin instruction principale

//lors que je compile il m'indique le code d'erreur suivant
//41: error: invalid conversion from 'char' to 'const char*'




0

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

Posez votre question
D'une part, un détail insignifiant, mais la ligne en question est totalement valide en C (juste, peux être que si le type de wData est une classe... Mais a part ça...)

Bon...
resultat=strcmp(test2,test1);


if (resultat==1)
{
cout << " les deux tableau sont différentes "<< endl;

}
else
{
cout << " les deux tableaux sont identiques "<< endl;
} 


Crack ! Boum ! HuUuUuUue
L'idée est pas mal mais souffre d'une faiblesse cachée : strcmp() ne renvoit pas 1 quand les chaines sont différentes, elle renvoit l'index de la premère différence ... Enfin, je dis mal. Le manuel dis :
Les fonctions strcmp() et strncmp() renvoient un entier inférieur, égal
       ou supérieur à zéro si s1 (ou ses n premiers octets) est respectivement
       inférieure, égale ou supérieure à s2.


Voilà, ce n'est donc pas
if (result == 1) puisque result peut valoir n'importe quoi. C'est :
if (result != 0). Là, Nabon, le programme ;°)

Ha oui, sauf l'erreur bête, au dessus :
char test1; etc...
char test1[] = "toto";
char test2[] = "tata"; // mais attentions, ces chaînes sont en lecture seule
// strcmp()...


//autre solution juste pour les chaines de caratères RW
char *test1;
test1 = new char[256]; // on réserve 256 octets pour cette chaîne
strcpy(test1, "toto");   // on utilise 5 octets pour stocker toto + le zéro terminal (caractère '\0')
// même chose pour test2, strcmp, etc ...

delete test1; //on rend les 256 octets au système.

Mais rien de tout ça n'est propre, en C++ faut utiliser les string, pas les char * !!

Ainsi
string test1 = "toto"; 
string test2 = "tata";

result = strcmp(test1.c_str(), test2.c_str());

c_str() est une méthode string qui permet de récuperer un char* à partir du string.
<humour_debile>
Ceci dis le jour ou mon slip me permettra de gagner une mercédès...
</humour_debile>

Mais ce n'est toujours pas propre :
string test1, test2;
test1 = "toto"; // juste pour montrer qu'on peut se passer de strcpy, maintenant...
test2="tata";

if (test1 == test2) { // elle est pas belle, la vie, en C++ ?
...


Bon, ceci dis, je ne saurais que te conseiller de bosser les deux forme précédente (qui sont du C) avec les strcpy, strcmp, voire même malloc et free à la place de new et delete (mais te casse pas trop, de toute façon pour ces 4 derniers ça ne change rien. JUSTE ne fais pas de free() sur un truc alloué par new ou de delete sur un truc alloué par malloc(), ça c'est très vilain !!)
De bosser ça donc, histoire de capter comment fonctionne les alloc mémoire en C/C++ (puisqu'il y a des vérités fondamentales avec les tableau en C qui reste vraies en C++).

Voilà, bon courage !!!
0
heu ... un truc m'échappe la !
quelque chose me dit que jamais on ne rentrera dans le if. ben ouais, comment une valeur peut elle etre égal en meme temps à 2 valeurs ?
if ((A == toto) && (A == tata))
// ça ne pourra jamais etre le cas.

ou alors comme je l'ai écris au début quelque chose m'a échappé ...
0
ben on pourra rentrer dans le if si toto=tata =)

mais en effet, il a du se tromper en recopiant la ligne, car ça m'a l'air d'être une fonction qui liste les fichiers d'un répertoire, et il veut les lister seulement si ce n'est pas le rép courant (=".") ni le rép d'avant (=".."). A mon avis la ligne doit être :
if ((!strcmp(wData.cFileName, ".."))&&((!strcmp(wData.cFileName, "."))))

mais ce n'est que mon humble avis :-)

++
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
1 avril 2005 à 13:05
salut,

je suis pas sur que c'est ça, mais si filename est un string, alors :


if(strcmp(wData.cFileName.c_str(),"."))


cordialement
0
DestyNov@ >> Oà la négation de ce que tu dis, sachant que
!( !A && !B) == (A || B)

;°)
0
ben oui mais moi j'ai écrit
if (!A && !B)

ce qui revient au même que
if (!(A && B))

et qui est le contraire
!( !A && !B)

nan?

et !( !A && !B) == (A || B) me surprend un peu en fait. car dans le premier on veut que A faux et B faux soit faux, donc A vrai et B vrai, je me trompe? oh la la, c quand même compliqué ces opérateurs binaires =)

++
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
2 avril 2005 à 19:47
d'accord avec SKZ81

!(!A && !B) équivaut à (A||B)
de même que
!(!A||!B) équivaut à (A&&B)

c'est Georges Boole qui l'a dit, et vous pouvez lui faire confiance!
c'est très intéressant, car cela permet d'optimiser les equations logiques.
On sait par exemple qu'un opérateur OU est plus rapide qu'un ET
pourquoi ? parce que pour faire une porte ET (en électronique numérique s'entend) on prend un NOR et on l'inverse, c'est moins compliqué que de fabriquer un ET natif, ça standartise la fabrication des composants. ==> !(!A||!B)
mais l'inconvénient c'est que les 3 négations ralentissent le traitement du ET, alors on privilégie le OU quand on veut optimiser.
D'ailleurs les équations logiques, ça peut se factoriser!
C'est très intéressant, parce que en C, on peut aller aussi loin qu'en assembleur pour ce genre d'optimisations.
Désolé pour le hors sujet, j'ai pas pu m'en empêcher ;-)

A+
0
c'est Georges Boole qui l'a dit, et vous pouvez lui faire confiance!

Je sais pas si Boole s'appelais Georges, mais il s'agit des lois de DeMorgan.
Enfin qui l'a dit on s'en fout, au final, tant que c'est vrai...

<chipotage>
>> on prend un NOR et on l'inverse,
Faux !! On inverse les entrée !!
</chipotage>

DestyNov@ :
>> nan?
Nan.

>> et !( !A && !B) == (A || B) me surprend un peu en fait. car dans le premier on veut que A faux et B faux soit faux,
On ne veux PAS (premier !) que A soit faux ET B soit faux.
Ce qui reviens au même que : On veut que A vrai OU B vrai, nan ?



Ceci dis, tout les types qui s'appelle SKZ81 sont des menteurs...
0
Bonjour,

Connaissez vous un moyen d'extraire une sous-chaine d'une chaine de caractère??

Merci d'avance

Antoine
0
Luffy =) Messages postés 365 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 19 mai 2006 110
21 avril 2005 à 11:45
Ben il faudrait commencer par faire un nouveau post ;-)
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
21 avril 2005 à 12:01
salut!
char chaine1[50]="ceci est une chaine de démonstration";

char chaine2[50]="\0";

strcpy(chaine2,chaine1+13);

chaine2[7]=0;



ce qui extrait le mot "chaine" de chaine1 et le copie dans chaine2
entre le 13e et le 20e caractere.

pour le rechercher remplacer, il y a tout un tas de trucs bien plus sympas en C++

A+
0