En fesant ca, c'est une comparaison entre adresses que fait le compilateur et non une comparaison de chaines. Voici un exemple:
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
int main(int argc, char* argv[])
{
Définition de deux chaines identiqueschar* chaine1 = "Bonjour";
char* chaine2 = "Bonjour";
strdup() permet de dupliquer une chaine en mémoire (allocation + copie)char* chaine3 = strdup("Bonjour");
On n'affiche le contenu et l'adresse des deux premières chaines. Tu remarques que les adresses sont identiquescout<<"Chaine 1 -"<<chaine1<<"- Adresse: "<<hex<<(long)chaine1<<endl;
cout<<"Chaine 2 -"<<chaine2<<"- Adresse: "<<hex<<(long)chaine2<<endl;
Ca à l'air de fonctionner correctement if (chaine1 == chaine2)
cout<<"Les adresses sont identiques"<<endl;
else
cout<<"Les adresses sont diffèrentes"<<endl;
On n'affiche le contenu et l'adresse de la troisième chaine. Tu remarques que les chaines sont strictement identiques mais que les adresses sont différentescout<<"Chaine 1 -"<<chaine1<<"- Adresse: "<<hex<<(long)chaine1<<endl;
cout<<"Chaine 3 -"<<chaine3<<"- Adresse: "<<hex<<(long)chaine3<<endl;
Voila le problème, la comparaison ne fonctionne pasif (chaine1 == chaine3)
cout<<"Les adresses sont identiques"<<endl;
else
cout<<"Les adresses sont diffèrentes"<<endl;
Aucun problème avec strcmp()if (strcmp(chaine1,chaine3)==0)
cout<<"Les chaines sont identiques"<<endl;
else
cout<<"Les chaines sont diffèrentes"<<endl;
return 0;
}
De plus, les deux premières chaines n'ont pas forcément la même adresse, cela dépend des compilateurs. Certains optimisent et regroupent tous les chaines identiques dans un espace mémoire alors que d'autres allouent systématiquement un espace mémoire par chaine.
Kaid -
kaid.fr.st-------------------------------
Réponse au message :
-------------------------------
> le petit bout de code suivant tourne bien, et pourtant, c'est du C, donc pas d'objet, ni de surcharge d'operateur :
>
> int main(int argc, char** argv)
> {
> char* buf = "Bour";
>
> if (buf == "Bonjour")
> cout << buf <<endl;
> else
> cout << "Pas bonjour, mais : " << buf << endl;
> getchar();
>
> return 0;
> }
>
> si tu veux bien prendre le temps de m'expliquer, moi qui ne manipule jamais les chaines de caracteres. pas debutant ...
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> >
> > C'est une erreur de débutant de tester le contenu d'une chaine de caractères comme tu viens de le faire. Ca marche seulement si buf est un objet et que l'opérateur == a été redéfinie.
> >
> > Kaid -
kaid.fr.st> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > > alors l, ca me sembletressimple : ton if n'est pas valide!!! enfin si il l'est, mais la condition est toujours vraie!avec ca, ca risque de mieux marcher : if (buf == "abcd").
> > > toujours 2 signes dans les tests ... (sauf < et >) ...
> > >
> > >
> > >
> > >
> > > -------------------------------
> > > Réponse au message :
> > > -------------------------------
> > >
> > > > Mon client marche c sur et il envoie bien abcd mais monserver marche po je suis debutant en server socket... :(
> > > > je sais pas comment faire en sorte que si la command = abcd alors j'ecrie Commande abcd Recu ! j'essaye avec recv ca compile bien mais peut importe le message que j'envoie avec mon client ca dit Commande abcd Recu ! meme si j'envoie pas abcd comme commande :(
> > > >
> > > >
> > > > #include <winsock2.h>
> > > > #pragma comment(lib,"ws2_32.lib")
> > > > #include <iostream.h>
> > > >
> > > > int main()
> > > > {
> > > > WSADATA WSAData;
> > > > WSAStartup(MAKEWORD(2,0), &WSAData);
> > > >
> > > > SOCKET sock;
> > > > SOCKADDR_IN sin;
> > > > SOCKADDR_IN csin;
> > > >
> > > > sock = socket(AF_INET, SOCK_STREAM, 0);
> > > >
> > > > sin.sin_addr.s_addr = INADDR_ANY;
> > > > sin.sin_family = AF_INET;
> > > > sin.sin_port = htons(21452);
> > > >
> > > > bind(sock, (SOCKADDR *)&sin, sizeof(sin));
> > > > listen(sock, 0);
> > > > char *buf = 0;
> > > > while(1)
> > > > {
> > > > recv(sock,buf,sizeof(buf),0);
> > > > int sinsize = sizeof(csin);
> > > > if((accept(sock, (SOCKADDR *)&csin, &sinsize)) != INVALID_SOCKET)
> > > > {
> > > > cout<<"Client connecter sur le port 21452\n"<<endl;
> > > >
> > > > if (buf = "abcd") {
> > > > cout<<"Commande abcd Recu !\n";
> > > > }
> > > > }
> > > > }
> > > > return 0;
> > > > }
> > > > */
> > > > ma syntaxe doit surrement etre fausse la
> > > > if (buf = "abcd") {
> > > > /*
> > >
> >
>