C++

islanmao Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
blurk Messages postés 486 Date d'inscription   Statut Membre Dernière intervention   -
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 5931 Date d'inscription   Statut Contributeur Dernière intervention   215
 
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
Oli
 
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   Statut Membre Dernière intervention   25
 
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   Statut Membre Dernière intervention   25
 
//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
SKZ81
 
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
Joshua
 
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
DestyNov@
 
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   Statut Membre Dernière intervention   160
 
salut,

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


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


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

;°)
0
DestyNov@
 
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   Statut Membre Dernière intervention   160
 
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
SKZ81
 
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
Antoine
 
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   Statut Membre Dernière intervention   110
 
Ben il faudrait commencer par faire un nouveau post ;-)
0
blurk Messages postés 486 Date d'inscription   Statut Membre Dernière intervention   160
 
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