Как разбить считаное предложение на слова (по пробелам) - 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-ом предложении.