Problème avec strcmp [Résolu]

Signaler
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
-
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008
-
Salut,

J'ai un petit problème avec strcmp.

Je défini pass:
#define pass "perso"

ensuite l'utilisateur rentre une valeur :
GetDlgItemText(Dlg2,IDC_EDIT,ligne,10);

Et je compare :
if (strcmp(ligne,pass)==0)
MessageBox(NULL, "Accés autorisé", "Succés",MB_OK| MB_ICONINFORMATION);

Si ligne=perso => ça marche
Mais le problème c'est que si ligne=perso214 => ça marche aussi ...

Comment faire pour que ça marche seulement pour "perso" SVP ???

21 réponses

Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
allez

char ligne[256] = {0};
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
ben tu fais:

int longueur=strlen(ligne);
bool OK=true;
for (int a=0;a!=longueur;a++){
if (ligne[a]!=pass[a]){OK=false;break;}

}

if (OK==true) {cout << "c'est bon";}
else{cout << "raté";}

mais tu ferais mieux de faire char * pass="perso"; dans ce cas (je pense)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
const char * pass="perso";

goutbouyo > fais voir plus de code (déclaration de Dlg2)
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
salut,
ton probleme vient ss doute d'ailleurs :)
il faut plus de code ...

sinon tu peux toujours essayer de remplacer strcmp par le code suivant (mais normalement ca ne va rien resoudre, car ton probleme doit venir d'ailleurs...) :
int stringcompare(register const char* s1,register const char*  s2)
{
   while (*s1 == *s2++)
      if (*s1++ == 0)
         return (0);
   return (*s1 - *(s2 - 1));
}

a++ ;)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
register ca sert à rien, et tu voudrais plutot faire un __fastcall (x86 - 32b)
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

C'est cool y a du monde intéresé là !!!

Voila la fonction :

//***************************************************
//CONTROLE MOT DE PASSE
//***************************************************
// Procédure de gestion de la boite de dialogue
LRESULT CALLBACK MainProc(HWND Dlg2,UINT message,WPARAM wParam,LPARAM lParam)
{
int Select;
switch(message)
{
case WM_INITDIALOG:
hDlg = FindWindow(fenetre,NULL);
EnableWindow(hDlg,FALSE);
Sleep(1000);
SetForegroundWindow(Dlg2);
hCtrl=GetDlgItem(Dlg2,IDC_EDIT);
PostMessage(Dlg2, WM_NEXTDLGCTL, (WPARAM) hCtrl, 1);

return TRUE;

case WM_COMMAND:
Select=LOWORD(wParam);
switch(Select)
{

case IDOK:
GetDlgItemText(Dlg2,IDC_EDIT,ligne,6);

//SI BON MOT DE PASSE
if (strcmp(ligne,pass)==0)
{
MessageBox(NULL, "Accés autorisé\nProtection désactivée", "Succés",MB_OK| MB_ICONINFORMATION);

EnableWindow(hDlg,TRUE);
SetForegroundWindow(hDlg);
EndDialog(Dlg2,0);
Dlg=FindWindow(NULL,"Protection activée");
SetWindowText(Dlg,"Protection désactivée");
}

//SI MAUVAIS MOT DE PASSE
else
{
entree=0;
PostMessage(hDlg,WM_CLOSE,0,0);
MessageBox(NULL, "Mot de passe erroné\nDésolé ...", "Erreur",MB_OK| MB_ICONWARNING);
DestroyWindow (Dlg2);
Intercepte();
}

return TRUE;

}
default:
return FALSE;

}
}
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
commet tu le declare ligne ? (et pourquoi c'est pas auto ?)
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Mon ligne je le déclare comme ça :
char ligne[10];

J'ai essayé comme ça :
char *ligne;
Mais ça plante...
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
GetDlgItemText n'ajoute pas le '\0' et ta taille est ridicule

ligne[256]; pour etre tranquille et utilise sizeof !
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

J'ai changé :
GetDlgItemText(Dlg2,IDC_EDIT,ligne,10);

par :
GetDlgItemText(Dlg2,IDC_EDIT,ligne,sizeof ligne);

et ça :
char ligne[10];

par ça :
char ligne(256];

> J'ai toujour le même problème ...

Je viens de voir ça :

strcmp effectue une comparaison des deux chaînes s1 et s2.

La comparaison débute avec le premier caractère de chaque chaîne et continue avec les suivants, jusqu'à ce que des caractères de même rang soient différents ou que l'une des chaînes soit terminée.

Ca doit être à cause de ça, non ???
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
mais je te l'ai dis le probleme !

"GetDlgItemText n'ajoute pas le '\0' ..."
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

J'ai fait ça :

GetDlgItemText(Dlg2,IDC_EDIT,buf,sizeof buf);
sprintf(ligne,"%s\0",buf);

Ca marche pas .
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
tu voudrais que ca fasse quoi ce truc ?

buf[GetDlgItemText(Dlg2,IDC_EDIT,buf,sizeof buf)] = 0;
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

LOL si en fait ça marche !

Je me trompais de fonction !! LOL

Ca aussi ça marche :
char ligne[256] = {0};

Ca fait quoi exactement ???
Ca rajoute \0 à la fin et il reste ?
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
char ligne[256] = {0};

ou

char ligne[256] = "";

ca initialise tout les elements à 0
Messages postés
429
Date d'inscription
mardi 6 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2008

Et si t'initialises comme ça :
char ligne[256];

Il y aura pas de \0 de fin de chaine ???
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
en auto le contenu sera aleatoire si pas initialisé (ce sera ce qui precedait à cet endroit sur la pile)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
GetDlgItemText met le zero final et retourne le nbr chars inseres sans compter le zero final.

ciao...
BruNews, MVP VC++
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
oui je viens de voir

mais ca pouvais etre quoi son probleme alors ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
va savoir, notre ami goutbouyo a de temps en temps des trucs mystiques...

ciao...
BruNews, MVP VC++