用于计算字符串中单词出现次数的C代码

时间:2018-09-18 02:03:12

标签: c string loops while-loop

我正在尝试编写一个接受字符串和单词的函数,并输出它出现在字符串中的次数。

我的出价:

int CountWord(char *s, char *word) {
    char first = word[0];
    int i, j, count = 0;
    while (s[i] != '\0') {
        if (s[i] == first)
            for (j = 1; (s[i+j] == word[j]) && (word[j] != '\0') && (s[i+j] != '\0'); ++j) {
                if (word[j] == '\0')
                    ++count;
        }
    }
    return count;
}

问题:它不适用于“代码块”。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的代码中存在多个问题:

  • 您没有初始化i
  • 您不增加i
  • (word[j] != '\0')循环中的测试for阻止了计数代码的执行。
  • 在字符串末尾找不到匹配项
  • 如果word为空字符串,则计数将不正确。
  • int在某些体系结构上可能没有非常长的字符串所需的范围。

这是更正的版本:

size_t CountWord(const char *s, const char *word) {
    char first = word[0];
    size_t i, j, count = 0;

    if (first == '\0')
        return strlen(s) + 1;

    for (i = 0; s[i] != '\0'; i++) {
        if (s[i] == first) {
            for (j = 1; word[j] != '\0' && s[i + j] == word[j]; j++)
                continue;
            if (word[j] == '\0')
                count++;
        }
    }
    return count;
}

请注意,此实现将为2返回CountWord("aaa", "aa"),这可能是预期的结果,也可能不是预期的结果。规范必须准确,并告诉您是要计算word的重复出现还是仅对不重叠的匹配进行计数。