Как эта функция C считает количество слов в строке? - PullRequest
0 голосов
/ 13 марта 2012

Мне нужна помощь, чтобы понять, как работает функция countWords в приведенной ниже программе.

Все это объясняется в «Программировании на С», написанном Стивеном Кочаном, но я не понял, как этоработает, когда дело доходит до «LookingForWord» и «++ wordCount» в функции countWords!

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

//function to determine if a character is alphabetic
bool alphabetic (const char c)
{
    if ( (c >= 'a' && c <= 'z') || ( c >= 'A' && c <= 'Z'))     
        return true;
    else
        return false;
}

// function to count the number of words in a string
int countWords ( const char string[])
{
    int i, wordCount = 0;
    bool lookingForWord = true, alphabetic ( const char c);

    for ( i = 0; string[i] != '\0'; ++i)
        if (alphabetic(string[i]) )
        {
            if ( lookingForWord )
            {
                ++wordCount;
                lookingForWord = false;
            }
        }
        else
            lookingForWord = true;

    return wordCount;
}

int main ( void)
{
    const char text1[] = {"Well, here goes."};
    const char text2[] = { "And here we go... again"};
    int countWords (const char string[]);

    printf( " %s - words = %i\n", text1, countWords (text1));
    printf( " %s - words = %i\n", text2, countWords (text2));

    return 0;
}

Ответы [ 2 ]

5 голосов
/ 13 марта 2012

Ваша функция считает первый буквенный символ в слове, затем пропускает оставшиеся буквы (устанавливая lookingForWord в false), и, как только она встречает небуквенный символ, она сбрасывает lookingForWord в истинное значение, так что следующая буква будет считаться новым словом.

Таким образом, функция будет считать все как отдельное слово, разделенное символом, для которого alphabetic() является ложным (поэтому она будет считать «не» и «часы» как два слова каждое).

0 голосов
/ 13 марта 2012
  1. Алгоритм начинается с инициализации lookingForWord значением true (как мы всегда начинаем искать слово)
  2. Затем он зацикливается, пока не найдет значение дозорного '\ 0'
  3. Проверяет, является ли char в позиции i буквенным
  4. Если да, мы нашли новое слово, мы увеличиваем wordCount и устанавливаем lookingForWord в false
  5. Мы продолжим цикл без увеличения wordCount, потому что alphabetic(string[i]) верно, но lookingForWord неверно
  6. Когда мы встречаемся с неалфавитным символом, мы устанавливаем wordCount в false, поэтому в следующем цикле, где alphabetic(string[i]) - true, мы увеличим wordCount

Я немного не уверен, почему автор этого кода вставил следующую строку:

bool lookingForWord = true, alphabetic ( const char c);

Я скомпилировал код, используя:

bool lookingForWord = true; //,alphabetic (const char c);

но результат остался прежним.

...