0

我必须将字符串“death”与文本文件中的任意五个字符串进行比较。

我似乎无法让我的功能正常工作,但我看不出我做错了什么。有人有什么建议吗?

*注意:我的 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;
}
4

3 回答 3

4

正如 Havenard 所说, strcmp() 需要以空字符结尾的字符串,这意味着每个字符串都需要以字符结尾'\0'。如果您坚持自己将字符串拼凑在一起,则必须记住在每个字符串的末尾附加该空字符,以便对它们执行字符串函数。

于 2013-04-05T01:43:18.123 回答
1

to 的参数strcmp必须由 NUL 终止。对当前代码的最简单更改是使数组长度为 6 个字符而不是 5 个,并用 0 或 '\0' 初始化第六个字符。或者,您可以strncasecmp使用长度为 5 的调用,这也将避免访问数组的第 6 个字符的未定义行为。

于 2013-04-05T01:42:50.033 回答
0

假设您有充分的理由放弃'\0'输入的终止,您可以strncasecmp()改用:

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

/*...*/
    testMatch = doesMatch(test1, test2, 5);
于 2013-04-05T01:45:25.950 回答