1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
//mingw Разбиение предложения на слова #include <iostream> #include <windows.h> //для русских символов using namespace std; //Будем инициализировать массив после создания его в памяти. void init_arr(char *&Arr, const int size) { for (int i = 0; i<size; i++) { Arr[i] = NULL; } } //Проверка является ли символ символом-разделителем bool is_separator(const char &ch) { switch (ch) { case ' ': case ' ': case ',': ////Сюда можно добавлять любые разделители. по аналогии с прокомментированным кодом //case '!': //case '?': return true; } return false; } //Функция читает число символов (т.к. <string.h> не используем, считаем руками сами) int str_len(char *S) { //Создается локальная копия указателя, поэтому любое его смещение не влияет на Передаваемый сюда массив символов. int count = 0; //Это число символов while (*S) { //Пока символ не нулевой count++; //Увеличивает счетчик символов *S++; //Используем адресную арифметику для смещения указателя на начало строки } return count; } int main() { ////////////////////////Для работы с русским текстом SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_CTYPE, "Russian"); /////////////////////////// char *S = "Привет, моя пень колода"; //Анализируемая строка cout << S << '\n' << endl; char *t = S; //Чуть позднее будет происходить смещение указателя на начало строки, поэтому запоминаем адрес на начало во временную переменную int size_string = str_len(S); //Запоминаем и размер основной строки. const int N = 255; //Размер длины строк в массиве строк /*Создаем двумерный массив. Это будет массив строк, в который мы запишем слова*/ char **MyStrinArray = new char*[size_string]; for (int i = 0; i<size_string; i++) { MyStrinArray[i] = new char[N]; init_arr(MyStrinArray[i], N); //Мало ли какой мусор может оказаться в созданной строке. Инициализируем для очистки } ///////////////////////////////////////////////// int j = 0; //Номер строки int k = 0; //Курсор, бегающий по строке, позиция символа /*Осталось заполнить массив словами*/ while (*S) { //Тут будет смещение указателя на начало строки, из-за этого создавалась t if (!is_separator(*S)) { //Если текущий символ НЕ является разделителем MyStrinArray[j][k] = *S; //Записываем его в строку на позицию к k++; //соответственно наращиваем к } //Если же разделитель else { k = 0; //Возвращаем k в начало j++; //Увеличиваем номер строки } //Пверка прошла, меняем указатель на начало строки, смещая его на следующий символ *S++; } //Выводим на экран массив for (int i = 0; i<size_string; i++) { if (str_len(MyStrinArray[i])) cout << MyStrinArray[i] << "\n"; //Нулевые строки пропускаем, они скорее всего нам бесполезны } //////////////////////////////////////////////// //Очищаем память for (int i = 0; i<size_string; i++) delete[]MyStrinArray[i]; delete[]MyStrinArray; // S=t; //Возвращаем указатель на начало строки к изначальному адресу/ Вероятно исходная строка может еще потребоваться, поэтому так можно делать, если не надо, можно не делать. cin.get(); } |
Добавить комментарий