Как разбить считаное предложение на слова (по пробелам) - 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 разбивает введенный текст на предложения, используя точки в качестве разделителей, а затем разбивает каждое предложение на отдельные слова, используя пробелы в качестве разделителей.
- В начале кода определяются функции:
CountChar
считает количество указанных символов в тексте.DeleteChar
удаляет символ в строке на определенной позиции.Trim
убирает лишние пробелы в начале, в конце и в середине строки.
- В функции
main
вводится текст, который включает в себя предложения, разделенные точками, и слова в предложениях, разделенные пробелами. - Текст сохраняется в буфере
buf
. Затем используется функцияstrtok
для разделения текста на предложения, используя точки в качестве разделителей. Каждое предложение сохраняется в отдельном массиве. - Затем каждое предложение разбивается на отдельные слова, используя пробелы в качестве разделителей. Слова сохраняются в трехмерном массиве
word
. - Количество слов в каждом предложении сохраняется в массиве
spaces
. - В конце кода выводится на экран массив предложений и массив слов.
- Для доступа к словам в предложении и буквам в слове используется трехмерный массив
word
. Например,word[i][j][k]
дает доступ к букве наk
-ом месте вj
-ом слове вi
-ом предложении.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д