C-код для подсчета количества вхождений слова в строку - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь написать функцию, которая принимает строку и слово, и выводит число раз, когда оно появляется внутри строки.

Моя ставка:

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 голосов
/ 18 сентября 2018

В вашем коде несколько проблем:

  • вы не инициализируете 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 или просто не перекрывающиеся совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...