2013-04-05 125 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);