2013-04-05 131 views
0

我必須將字符串「death」與文本文件中的任意五個字符串進行比較。如何正確執行strcmp?

我似乎無法讓我的函數來工作,但我看不到我在做什麼錯。任何人有任何建議?

*注:我只的strcmp返回-1或1,但從來沒有0

#include <stdio.h> 
#include <stdbool.h> 
#include <string.h> 

//Function to check if strings are a match regardless of case 
bool doesMatch (char testText[], char testDeath[]) { 
if (strcasecmp(testDeath, testText) == 0) { 
     return true; 
} 
else 
     return false; 
} 

int main (int argc, char *argv[]) { 
char test1[5] = {getchar(), getchar(), getchar(), getchar(), getchar()}; 
bool testMatch; 
char test2[5] = {'d','e','a','t','h'}; 

//Test arrays until End of FIle 
while (test1[4] != EOF) { 

     testMatch = doesMatch(test1, test2); 
     if (testMatch == true) { 
      printf ("Match!\n"); 
     } 

     //"slide" array down one character 
     test1[0] = test1[1]; 
     test1[1] = test1[2]; 
     test1[2] = test1[3]; 
     test1[3] = test1[4]; 
     test1[4] = getchar(); 

} 

return 0; 
} 
+6

'的strcmp()'只能比較空終止字符串。 – Havenard 2013-04-05 01:34:37

+0

如果你正在使用'testMatch ==真',我認爲這應該被標記爲C++,不C. – 2013-04-05 01:38:11

+1

究竟你「我只的strcmp -1或1,但從來沒有返回0」是什麼意思?你實現了你自己的strcmp,它應該返回0但不是? – Kevin 2013-04-05 01:42:01

回答

4

正如Havenard說的strcmp()需要空終止字符串,這意味着每個字符串需要與字符'\0'結束。如果你堅持自己拼湊字符串,你必須記住在每個字符的末尾追加那個空字符,以便對它們執行字符串函數。

+0

謝謝@Havenard和Parker Kemp。我忘了添加'\ 0'字符。你剛剛爲我解決了2個小時的挫折。 – user2247285 2013-04-05 01:52:23

1

strcmp的參數必須由NUL終止。對當前代碼的最簡單的改變是讓你的數組長6個字符而不是5個字符,並用0或'\ 0'初始化第六個字符。或者,您可以調用strncasecmp,長度爲5,這也可以避免訪問數組中第6個字符的未定義行爲。

0

假設你有一個很好的理由要離開關閉您輸入的終止'\0',你可以使用strncasecmp()代替:

bool doesMatch (char testText[], char testDeath[], size_t n) { 
    return strncasecmp(testDeath, testText, n) == 0; 
} 

/*...*/ 
    testMatch = doesMatch(test1, test2, 5);