C和Win32 API编程:比较字符串

C和Win32 API编程:比较字符串,c,string,winapi,comparison,char,C,String,Winapi,Comparison,Char,我正在用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); 我正在将其值提取到名为userna

我正在用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);
我正在将其值提取到名为username的字符串中

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!但产出仍然没有变化。请参见输出(以及代码中的比较):
写入
username==c\u user
检查它们是否都指向相同的内存位置。

您需要调用以比较字符串的值。

写入
username==c_user
检查它们是否都指向同一内存位置。
您需要调用来比较字符串的值。

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

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


您应该为此使用strcmp,如果希望忽略此案例,则应使用strcmp

您应该为此使用strcmp,如果您想忽略此案例,则应使用strcmp

if(strcmp(用户名,c_用户)==0) { ... }如果(strcmp(用户名,c_用户)==0) { ...
}

C和C++没有内置字符串类型,因此不能用这种方式比较字符串。C和C++使用字符数组,这个语法简单地比较每个数组的地址(不匹配)。


使用“<代码>”StrcMP()/<代码>或“TcSCMP”()/代码> .< /P> < P> C和C++没有内置字符串类型,因此无法以这种方式比较字符串。C和C++使用字符数组,这个语法简单地比较每个数组的地址(不匹配)。


相反,请使用strcmp()或
\u tcscmp()
我相信您实际上需要使用wchar(宽字符)。我已经有一段时间没有研究语法了,但我认为它应该是这样的:

wchar_t*c_user=L“foo”

如果(wcscmp(用户名,c_用户)==0)

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


您还可以研究TCHAR,它是字符类型的更通用的表示形式(它根据编译器设置的不同而变化)。根据设置的不同,我认为它可能是字符或wchar\t。

我认为您实际上需要使用wchar\t(宽字符)。我已经有一段时间没有研究语法了,但我认为它应该是这样的:

wchar_t*c_user=L“foo”

如果(wcscmp(用户名,c_用户)==0)

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


您还可以研究TCHAR,它是字符类型的更通用的表示形式(它根据编译器设置的不同而变化)。根据设置的不同,我认为它可能是字符或字符。

使用函数GetWindowTextA()和MessageBoxA(),对我有效。

使用函数GetWindowTextA()和MessageBoxA(),对我有效。

你试过在messagebox中显示它们或比较长度吗?可能重复:@krs1 Yep,我认为问题就在这里。见上文。垃圾值而不是打印c_user(=foo)@Ishan在这种情况下,如果您调试显示垃圾值的原因会更好。我们试图帮助您比较字符串,如果您得到的是垃圾值,那么字符串就不起作用。谢谢你的理解。在GetWindowTextOK中设置断点,我刚刚得到答案。我在一个没有外壳的开关里给c_用户赋值!所以,它从未被执行过!我在那里放置了一个断点,但它不起作用。这在我的头脑中敲响了一些钟声,当我把宣言放在外面时,它工作得很好!非常感谢。您是否尝试过在messagebox中显示它们或比较长度?可能重复:@krs1是的,我认为问题出在那里。见上文。垃圾值而不是打印c_user(=foo)@Ishan在这种情况下,如果您调试显示垃圾值的原因会更好。我们试图帮助您比较字符串,如果您得到的是垃圾值,那么字符串就不起作用。谢谢你的理解。在GetWindowTextOK中设置断点,我刚刚得到答案。我在一个没有外壳的开关里给c_用户赋值!所以,它从未被执行过!我在那里放置了一个断点,但它不起作用。这在我的头脑中敲响了一些钟声,当我把宣言放在外面时,它工作得很好!非常感谢。我已经试过了。但它不起作用。当我试图在消息框中打印出c_用户时,它显示了一个垃圾值!所以,问题可能就在那里!我试过了。但它不起作用。当我试图在消息框中打印出c_用户时,它显示了一个垃圾值!所以,问题可能就在那里!小修正:在C++中,“string类型”可以被当作<代码> STD::String 或 STD::WString ,它实现<代码>运算符==/COD>1、小修正:在C++中,“string类型”可以被当作<代码> STD::String 或,它实现<代码>运算符==/COD>1尽管如此。
   if ( strcmp( username, c_user) == 0 )
   {
       // 0 indicate there is no difference, thus equal
    }
    else
    {
    }