2017-06-19 61 views
0

我已經厭倦了這樣的方法來比較字符串:在C.緩衝區一個字符串比較反對字符串文字

if(strcmp(buf, "AUTHENTICATE") != 0) { 

我的緩衝區包含「認證」裏面串,你可以在調試器檢查看看。但結果是strcmp返回值不等於0.爲什麼? enter image description here

+1

只是一個瘋狂的猜測:'buf'是否包含終止的''\ 0''字節?如果圖片中有任何重要信息,請在您的問題中以文字形式提供。 –

+0

如果你比較空buf怎麼辦?你確認buf不是空的嗎? – LethalProgrammer

+0

它包含。這個例子似乎現在起作用。我做了一些乾淨的,多次建立並開始工作。所以上面的代碼工作正常! –

回答

2

正如一個提醒,strcmp應該比較兩個字符串,字符由 字符,並返回只要2個字符是不同的。在這種情況下,該函數返回第一個ASCII值和第二個ASCII值 之間的差值 。如果符合\0字符,則它是函數返回前字符串的最後一個計算的 字符。

我看到2個可能的原因,當你希望它返回0。

  1. 如果您buf是用戶輸入strcmp將返回大於0的另一個值,它可能包含結束\n,其字符串文字「AUTHENTICATE」不包含。 這取決於你如何處理輸入:你使用什麼函數,你是否將整個輸入存儲到buf等...
  2. 你的buf不包含nul終止符。請注意,在這種情況下,buf不是有效的字符串。請注意,strcmp將繼續評估兩個字符串,直到找到\0字符,這意味着如果buf不包含一個字符,則在buf中包含的最後一個字符被評估後,strcmp將繼續讀取內存,您肯定不希望這些字符被讀取。