Как разбить считаное предложение на слова (по пробелам) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

как разбить считаное предложение на слова(по пробелам)? или как считать в массив строк предложение до точки? заранее спасибо вы моя последняя надежда.

Решение задачи: «Как разбить считаное предложение на слова (по пробелам)»

textual
Листинг программы
#include <stdio.h> 
#include <stdlib.h>
#include <string.h>
#define size 1024
 
//фция считает, сколько символов "с" находится в тексте "text"
int CountChar (char *text, char c)
{   int i = 0, len = strlen(text), count = 0;
    while (i<len)
        if (text[i++] == c)
            count++;
    return count;
}
 
//фция удаляет символ в строке на позиции pos
void DeleteChar (char *text, int pos)
{   int len = strlen(text), i = pos;
    if (pos < len && pos > -1)
        while (i <= len)
        {   text[i] = text[i+1];
            i++;
        }
}
 
//фция убирает возможные лишние пробелы 
void Trim (char *text)
{   //убираем в начале
    int i = 0, len = strlen(text), span = 0;
    while (text[i] == ' ')
        DeleteChar (text, i++);
    
    //убираем в конце
    len = strlen(text);
    i = len-1;
    while (text[i] == ' ')
        text[i--] = '\0';
 
    //убираем в середине
    i = 0;
    len = strlen(text);
    while (i < len-1)
    {   if (text[i] == ' ' && text[i+1] == ' ')
            DeleteChar(text, i+1);
        else
            i++;
    }
}
 
int main ()
{   char buf[size], **sentence, ***word;
    int periods, *spaces, i, j;
    
    //считываем с консоли текст, в который (по условию) входят предложения с точками, 
    //и где слова в предложениях разделены пробелами
    fgets(buf, size, stdin);
    buf [strlen(buf) - 1] = '\0';   //убираем \n в конце текста
 
    //кво предложений в тексте равно кву точек
    periods = CountChar (buf, '.');
 
    //структурируем текст как матрицу: строки матрицы - это предложения
    sentence = (char**) malloc (periods * sizeof(char*));
 
    //разбиваем весь текст на предложения 
    i = 0;
    char *pSentence;
    pSentence = strtok (buf, ".");
    while (pSentence != NULL && i < periods)
    {   //просим память под каждое предложение, символы - это "столбцы"
        sentence[i] = (char*) malloc (strlen(pSentence) + 1);
        strcpy(sentence[i], pSentence);
        Trim (sentence[i]); //убираем возможные пробелы
        pSentence = strtok (NULL, ".");
        i++;
    }
 
    //готово: массив предложений
    printf("\n\nArray of sentences:\n");
    for (i = 0; i<periods; i++)
        printf("Sentence %d: %s\n", i, sentence[i]);
 
    //sentence[i] - это i-тое предложение
    //sentence [i][j] - это буква на j-том месте в i-том предложении
 
    //-------------------------------------------------------------------------------------------
 
    //разбиваем весь текст на слова
    //первый индекс - кво строк
    word = (char***) malloc (periods * sizeof(char**));
 
    //кво слов в каждой строке
    spaces = (int*) malloc (periods * sizeof(int));
 
    for (i = 0; i<periods; i++)
    {   //кво слов в предложении
        spaces[i] = CountChar (sentence[i], ' ') + 1; 
        //указатели на слова в данной строке, второй индекс - кво слов в строке
        word[i] = (char**) malloc (spaces[i] * sizeof(char*));
        j = 0;
        char *pWord;
        pWord = strtok (sentence[i], " ");
        while (pWord!= NULL && j < spaces[i])
        {   //просим память под каждое слово, третий индекс - символы
            word[i][j] = (char*) malloc (strlen(pWord) + 1);
            strcpy(word[i][j], pWord);
            pWord = strtok (NULL, " ");
            j++;
        }
    }
 
    //готово: массив слов
    printf("\n\nArray of words:\n");
    for (i = 0; i<periods; i++)
    {   for (j = 0; j<spaces[i]; j++)
            printf("%s ", word[i][j]);
        printf("\n");
    }
 
    //word [i][j] - это слово на j-том месте в i-том предложении
    //word[i][j][k] - это буква на k-том месте в j-том слове в i-том предложении
 
 
    //-------------------------------------------------------------------------------------------
    //полученный функционал позволяет вывести по запросу 
    //         i-тое предложение                                sentence[i]
    //         j-тую букву в i-том предложении                  sentence[i][j]
    //         j-тое слово в i-том предложении                  word[i][j]
    //         k-тую букву в j-том слове в i-том предложении    word[i][j][k]
 
    getchar();
    return 0;
}

Объяснение кода листинга программы

Этот код на C разбивает введенный текст на предложения, используя точки в качестве разделителей, а затем разбивает каждое предложение на отдельные слова, используя пробелы в качестве разделителей.

  1. В начале кода определяются функции:
    • CountChar считает количество указанных символов в тексте.
    • DeleteChar удаляет символ в строке на определенной позиции.
    • Trim убирает лишние пробелы в начале, в конце и в середине строки.
  2. В функции main вводится текст, который включает в себя предложения, разделенные точками, и слова в предложениях, разделенные пробелами.
  3. Текст сохраняется в буфере buf. Затем используется функция strtok для разделения текста на предложения, используя точки в качестве разделителей. Каждое предложение сохраняется в отдельном массиве.
  4. Затем каждое предложение разбивается на отдельные слова, используя пробелы в качестве разделителей. Слова сохраняются в трехмерном массиве word.
  5. Количество слов в каждом предложении сохраняется в массиве spaces.
  6. В конце кода выводится на экран массив предложений и массив слов.
  7. Для доступа к словам в предложении и буквам в слове используется трехмерный массив word. Например, word[i][j][k] дает доступ к букве на k-ом месте в j-ом слове в i-ом предложении.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы