2011-04-14 111 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(),它適用於我。