2011-04-14 114 views
1

我正在使用C和Windows API编写程序。我正在使用Visual Studio 2010 Express并将字符集设置为“未设置”。我做了一个编辑控件来接受用户名。这里的声明:在C和Win32 API中编程:比较字符串

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

+0

您是否尝试过在消息框中显示它们或比较长度? – krs1 2011-04-14 18:15:41

+0

可能的重复:http:// stackoverflow。com/questions/5611250/file-read-write-problem/5611268#comment-6391136 – 2011-04-14 18:20:26

+0

@ krs1是的,我认为问题在那里。往上看。垃圾值而不是打印c_user(= foo) – 2011-04-14 18:21:32

回答

1

写入username == c_user检查是否它们都指向同一个存储单元。
您需要拨打strcmp来比较字符串的值。

+0

我曾试过。但它不起作用。当我试图在消息框中打印出c_user时,它会显示一个垃圾值!所以,问题可能在那里! – 2011-04-14 18:18:28

1

我会使用STRCMP(或其任何同义词)

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

它不起作用。查看编辑和截图! – 2011-04-14 18:20:40

0

,如果你想忽略的情况下,应使用STRCMP这一点,或strcmpi。

0

如果(STRCMP(用户名,c_user)== 0){ ... }

2

C和C++有没有内置的字符串类型,所以你不能比较字符串这样。 C和C++改为使用一个字符数组,这个语法简单地比较每个数组的地址(不匹配)。

改为使用strcmp()_tcscmp()

+0

小修正:在C++中,“字符串类型”可以作为'std :: string'或'std :: wstring',实现'operator =='。 +1。 – jweyrich 2011-04-14 18:50:21

1

我相信你实际上需要使用wchar_t(宽字符)。它已经有一段时间了,因为我已经看过语法,但我认为它会是这样的:

wchar_t * c_user = L“foo”;

如果(wcscmp(用户名,c_user)== 0) ...

确保用户名也被定义为正确的类型。

你也可以看看TCHAR,它是一个更通用的字符类型的表示(它根据编译器设置而改变)。取决于设置,它可能是char或wchar_t我认为。

0

使用函数GetWindowTextA()和MessageBoxA(),它适用于我。