Программирование на C и Win32 API: сравнение строк - PullRequest
1 голос
/ 14 апреля 2011

Я пишу программу на C и Windows API. Я использую Visual Studio 2010 Express, и для набора символов установлено значение «Не установлено». Я сделал элемент управления для изменения имени пользователя. Вот объявление:

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

Я извлекаю его значение в строку с именем пользователя.

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

Теперь действительное имя пользователя находится в строке с именем c_user:

char c_user[] = "foo";

Когда я сравниваю их, чтобы проверить, ввел ли пользователь действительное имя пользователя, используя следующий код,

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

Это никогда не подтверждается. Вместо этого всегда выполняется условие else! Где я делаю ошибку?

Как это исправить?

Я пробовал strcmp! Но все равно выход не меняется. Смотрите вывод (и сравнение в коде): enter image description here

Ответы [ 7 ]

3 голосов
/ 14 апреля 2011

C и C ++ не имеют встроенного строкового типа, поэтому вы не можете сравнивать строки таким образом. C и C ++ вместо этого используют массив символов, и этот синтаксис просто сравнивает адрес каждого массива (который не будет совпадать).

Вместо этого используйте strcmp() или _tcscmp().

2 голосов
/ 14 апреля 2011

Полагаю, вам действительно нужно использовать wchar_t (широкие символы).Прошло много времени с тех пор, как я посмотрел синтаксис, но я думаю, что это будет примерно так:

wchar_t * c_user = L "foo";

if (wcscmp (username,c_user) == 0) ...

убедитесь, что имя пользователя также определено как правильный тип.

вы также можете взглянуть на TCHAR, который является более общим представителем символьного типа (этоизменения в зависимости от настроек компилятора).в зависимости от настроек, это будет либо char, либо wchar_t, я думаю.

1 голос
/ 14 апреля 2011

Я бы использовал strcmp (или любой синоним)

   if ( strcmp( username, c_user) == 0 )
   {
       // 0 indicate there is no difference, thus equal
    }
    else
    {
    }
1 голос
/ 14 апреля 2011

Запись username == c_user проверяет, указывают ли они оба на одно и то же место в памяти.
Вам необходимо вызвать strcmp, чтобы сравнить значения строк.

0 голосов
/ 14 апреля 2011

Используйте функции GetWindowTextA () и MessageBoxA (), у меня это работает.

0 голосов
/ 14 апреля 2011

if (strcmp (username, c_user) == 0) { ... }

0 голосов
/ 14 апреля 2011

Вы должны использовать для этого strcmp или strcmpi, если хотите игнорировать регистр.

...