Programmation en API C et Win32: comparaison de chaînes

J’écris un programme en API C et Windows. J’utilise Visual Studio 2010 Express et le jeu de caractères est défini sur “Non défini”. J’ai fait un contrôle d’édition pour accepter le nom d’utilisateur. Voici la déclaration:

hwnduser = CreateWindow (TEXT("EDIT"), NULL, WS_VISIBLE | WS_CHILD | WS_BORDER, 220, 70, 80, 20, hwnd, (HMENU) 3, NULL, NULL); 

Je récupère sa valeur dans une chaîne nommée nom d’utilisateur.

 len = GetWindowTextLength(hwnduser) + 1; GetWindowText(hwnduser, username, len); 

Maintenant, le nom d’utilisateur valide est dans une chaîne appelée utilisateur_c:

 char c_user[] = "foo"; 

Quand je les compare pour vérifier si l’utilisateur a entré un nom d’utilisateur valide en utilisant le code suivant,

 if (username == c_user) { MessageBox(hwnd, "Foo", "Bar", MB_OK); } else { MessageBox(hwnd, "Bar", "Foo", MB_OK); } 

Ça ne valide jamais. Au lieu de cela, la condition else est toujours exécutée! Où est-ce que je fais une erreur?

Comment corriger cela?

J’ai essayé strcmp! Mais encore, la sortie ne change pas. Voir le résultat (et la comparaison en code): entrez la description de l'image ici

C et C ++ n’ont pas de type de chaîne intégré et vous ne pouvez donc pas comparer les chaînes de cette façon. C et C ++ utilisent à la place un tableau de caractères et cette syntaxe compare simplement l’adresse de chaque tableau (qui ne correspondra pas).

Utilisez plutôt strcmp() ou _tcscmp() .

Je crois que vous aurez réellement besoin d’utiliser wchar_t (caractères larges). ça fait longtemps que je n’ai pas regardé la syntaxe mais je pense que ça va ressembler à ça:

wchar_t * c_user = L “foo”;

if (wcscmp (nom d’utilisateur, c_user) == 0) …

assurez-vous que le nom d’utilisateur est également défini en tant que type correct.

vous pouvez également regarder dans TCHAR, qui est une représentatique plus générique d’un type de caractère (elle change en fonction des parameters du compilateur). selon les parameters, ce sera soit un personnage, soit un wchar_t, je pense.

L’écriture du username == c_user vérifie si les deux pointeurs pointent vers le même emplacement mémoire.
Vous devez appeler strcmp pour comparer les valeurs des chaînes.

J’utiliserais strcmp (ou n’importe quel synonyme)

  if ( strcmp( username, c_user) == 0 ) { // 0 indicate there is no difference, thus equal } else { } 

Vous devez utiliser strcmp pour cela ou strcmpi si vous voulez ignorer la casse.

if (strcmp (nom d’utilisateur, c_user) == 0) {…}

Utilisez les fonctions GetWindowTextA () et MessageBoxA (), cela fonctionne pour moi.