Problème avec strcmp

Résolu
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008 - 28 oct. 2004 à 18:00
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008 - 28 oct. 2004 à 22:16
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

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 19:17
allez

char ligne[256] = {0};
3
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
28 oct. 2004 à 18:26
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)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 18:30
const char * pass="perso";

goutbouyo > fais voir plus de code (déclaration de Dlg2)
0
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
28 oct. 2004 à 18:31
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++ ;)
0

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

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 18:37
register ca sert à rien, et tu voudrais plutot faire un __fastcall (x86 - 32b)
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
28 oct. 2004 à 18:50
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;

}
}
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 18:54
commet tu le declare ligne ? (et pourquoi c'est pas auto ?)
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
28 oct. 2004 à 18:57
Mon ligne je le déclare comme ça :
char ligne[10];

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

ligne[256]; pour etre tranquille et utilise sizeof !
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
28 oct. 2004 à 19:14
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 ???
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 19:16
mais je te l'ai dis le probleme !

"GetDlgItemText n'ajoute pas le '\0' ..."
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
28 oct. 2004 à 19:21
J'ai fait ça :

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

Ca marche pas .
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 19:23
tu voudrais que ca fasse quoi ce truc ?

buf[GetDlgItemText(Dlg2,IDC_EDIT,buf,sizeof buf)] = 0;
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
28 oct. 2004 à 19:30
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 ?
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 19:32
char ligne[256] = {0};

ou

char ligne[256] = "";

ca initialise tout les elements à 0
0
goutbouyo Messages postés 429 Date d'inscription mardi 6 juillet 2004 Statut Membre Dernière intervention 12 janvier 2008
28 oct. 2004 à 19:35
Et si t'initialises comme ça :
char ligne[256];

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

ciao...
BruNews, MVP VC++
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 oct. 2004 à 20:59
oui je viens de voir

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

ciao...
BruNews, MVP VC++
0
Rejoignez-nous