#include <iostream>
#include <ctype.h>
using namespace std;
//Класс список слов
struct Words
{
char* Word; //Строка (макс. 5 символов)
Words* NextWord; //Указатель на класс
public:
void Add(char *str) //Функция добавления слова
{
int len = strlen(str); //Определим размерность строки
Words *This = this; //Создадим указатель на текущий объект класса
while (len>0) //Пока размер строки > 0
{
This->Word = new char[5]; //Создадим объект типа char размерностью 5 байт (4 символа + 1 завершающий строки)
This->NextWord = NULL; //Указатель на клас поставим в null
if (len > 4) //Если размер слова(строки) >4
{
This->NextWord = new Words; //Выделим память под след. элемент
strncpy(This->Word,str,4); //Скопируем 4 символа в СписокСлов-Строка
This->Word[4] = 0; //Завершающий символ строки
str+=4; //Сместим указатель входящей строки на 4 байта (отбросим 4 символа в начале строки)
len -= 4; //Уменьшим длину на 4 ед.
}
else //Если размер строки слова <= 4
{
strncpy(This->Word,str,strlen(str));//Скопируем [длину строки] символа в СписокСлов-Строка
This->Word[strlen(str)] = 0; //Поставим завершающий символ строки
len -= strlen(str); //Уменьшим размер *ну можно еще и сдвинуть но так как циклим мы len а не strlen(str) этого не понадобится
}
This = This->NextWord; //Сместим указатель на сл. элемент списка
}
}
void Print(void) //Функция вывода на экран по цепочки
{
Words *Temp = this;
while (Temp) //Пока Temp не NULL
{
cout<<Temp->Word<<" -> ";
Temp = Temp->NextWord; // Temp = след. элемент списка
}
cout<<"!!!";
}
};
int AddString (Words *Arr, char *str) //Функция добавления строки (со словами) в массив Arr - массив объектов (списка), str - строка.. На выходе кол-во заполненых
//Элементов массива
{
char *buffer = new char [1024]; //Буферная переменная
int cnt = 0; //Кол-во символов промежуточное
int ArrCount = 0; //Кол-во эл. массива (которые заполнили)
while (strlen(str) != 0) //Пока не достигнут конец строки (Обойдем всю строку другими словами)
{
if (isalnum((unsigned char)str[0])) //Если символ в строке цифра или буква то значит мы в слове
{
buffer[cnt] = str[0]; //Запишим в буфер этот символ
cnt++; //Увеличим счетчик
}
else if (cnt != 0) //Иначе - тоесть разделитель между строк и подтра*цензура*ся на случей идущих подряд разделителей
{
buffer[cnt] = 0; //Поставим в буфере символ конца строки
Arr->Add(buffer); //Вызовим функцию класса на добавление слова в список
cnt = 0; //Обнулим промежуточное кол-во символов, т.к. уже будем искать новое слово
Arr++; //Сдвиним указатель на массив объектов на 1 элемент
ArrCount++; //Увеличим кол-во заполненых эл. массива
delete[] buffer; //Отчистим буферную переменную
buffer = new char[1024]; //И заново выделим ей память
}
str++; //сдвиним указатель на строку, тем самым отбросив 1 символ из начала
}
if (cnt != 0) //Если на выходе из цикла пром. кол-во не нулевое, значит в буфере находится последнее слово
{
buffer[cnt] = 0; //Завершающий символ
Arr->Add(buffer); //Запишим это слово в наш список
ArrCount++; //Увеличим кол-во заполненых эл-ов
}
delete[] buffer; //почистим буферную переменную
return ArrCount; //Вернем кол-во заполненых элементов
}
void main (void)
{
setlocale(LC_ALL,"Russian_Russia");
Words s[20]; //За размерностью следить в этом месте нужно... ЧТо бы за пределы не выйти
char st[1024];
gets(st); //Получим строку
setlocale(LC_ALL,".866");
int CountEl = AddString(s,st);
for (int i=0; i< CountEl; i++) //Обойдем все элементы и выведим на экран
{
s[i].Print();
cout<<endl;
}
system("pause");
}