Подсчет слов в строке в C - PullRequest
1 голос
/ 25 апреля 2020

Я написал блок кода для подсчета количества слов, из которых состоит строка.

Я уже пробовал несколько входов, и большинство из них получаются правильными, но есть случаи, указывающие, что моя программа имеет фундаментальный logi c недостаток. Например, если я установлю пустую строку, результат будет ошибочно равен 1, и если я добавлю пробел прямо в конец строки, по какой-то причине я не знаю, что результат будет равен 1 + фактическое количество слов в строка и, как показывает мой код, я хотел бы убрать все пробелы / табуляции.

Моя программа в основном делает это среди строки, но, к сожалению, не в конце. Мне совершенно ясно, что с моей функцией что-то не так, но я не могу понять, что именно. И я знаю, что, вероятно, это будет легче реализовать с помощью внешних библиотек, но меня просят реализовать его с помощью чистого базового c кода.

Это то, что у меня есть:

int get_number_of_words(char input_string[])
{
    int i, j, counter = 0;
    for (i = 0; i < STRING_SIZE; i++)
    {
        if (input_string[i] != ' ')
        {
            counter++;
            j = i;
            while ((input_string[j] != ' '))
                j++;
            i = j;
        }
    }
    return counter;
}

Я приведу несколько примеров строк ввода и вывода:

  • "Hello\t\t\t" - 1 слово (вкладки игнорируются)
  • "Hello" - 1 слово
  • "" - 0 слов
  • "\t\tThis is a basic example\t\t\t" - 5 слов (вкладки игнорируются)
  • "This is a basic example " - также 5 слов (последний пробел игнорируется)

Позже мне придется принимать во внимание различные знаки препинания (которые включены в слова), но в то же время все, что я хочу, это gr asp ядро ​​программы.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2020

Вот модифицированный код. Пожалуйста, обратитесь к комментариям для лучшего понимания. Я также предположил, что STRING_SIZE будет больше, чем длина входной строки.

int get_number_of_words(char input_string[])
{
    int i, j, counter = 0;
    for (i = 0; i < STRING_SIZE; i++)
    {
        // This makes sure that when the 'i' in input_string is reached to end,
        // you must not check further. It is basically last char of string.
        if(input_string[i]=='\0')break;

        // only enter this if condition if encounter a char a-z or A-Z
        if((input_string[i]>='A'&&input_string[i]<='Z')||(input_string[i]>='a'&&input_string[i]<='z'))
        {
            counter++;
            j = i;
            // if there is no ' ' then this loop will run forever.
            // thus added a constraint. 
            // iterate this loop till you read char from a-z or A-Z
            while (j<STRING_SIZE && ((input_string[j]>='A'&&input_string[j]<='Z')||(input_string[j]>='a'&&input_string[j]<='z')))
                j++;
            i = j;
        }

    }
    return counter;
}
0 голосов
/ 25 апреля 2020

Использование al oop вроде:

for (i = 0; i < STRING_SIZE; i++)

кажется плохой идеей. Я предполагаю, что STRING_SIZE - это некоторое фиксированное число, установленное в #define, которое не будет работать, поскольку входная строка может быть как короче, так и длиннее.

Вместо этого я предлагаю вам использовать указатель для итерации строки, то есть инициализировать указатель так, чтобы он указывал на начало строки, и в каждом l oop увеличивайте указатель и продолжайте l oop, пока не увидите завершение строки.

Может выглядеть так:

#include <stdio.h>

int is_whitespace(char c)
{
    // Check for space or tab
    return (c == ' ' || c == '\t');
}

int get_number_of_words(char* input_string)
{
    int counter = 0;

    // Make p point to start of string
    char* p = input_string;

    // Remove whitespaces, i.e. look for next word or end-of-string
    while (*p && is_whitespace(*p)) ++p;

    while(*p)
    {
        ++counter;

        // Continue down the string until a whitespace or end-of-string is found
        while(*p && !is_whitespace(*p)) ++p;

        // Remove whitespaces, i.e. look for next word or end-of-string
        while (*p && is_whitespace(*p)) ++p;
    }
    return counter;
}


int main()
{
    char* str1 = "some text";
    printf("%s %d\n", str1, get_number_of_words(str1));
    char* str2 = "         some                   text                  ";
    printf("%s %d\n", str2, get_number_of_words(str2));
    char* str3 = "some\ttext";
    printf("%s %d\n", str3, get_number_of_words(str3));
    char* str4 = "\tsome\t\ttext\t\t";
    printf("%s %d\n", str4, get_number_of_words(str4));
    return 0;
}

Вывод:

some text 2
         some                   text                   2
some    text 2
    some        text         2
0 голосов
/ 25 апреля 2020

Если вы просто ищете рабочий алгоритм, вот логарифм c:

  1. Разделите / разделите предложение / (цепочку слов), используя пробел. Результатом будет массив.
  2. Фильтруйте массив, чтобы удалить все пустые строки (пробелы), нежелательные слова, такие как 'is' 'a' 'an'.
  3. Подсчитайте длину полученного массива .

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

...