/*
Произвести выравнивание по ШИРИНЕ введенного текста, для чего к каждой строке применить функцию WIDE(str,k)
*/
/*
codeby.net
Autor: DarkKnight125 (Denis Goncharov)
*/
#include <iostream>
using namespace std;
//Варавнивание по правому краю
char* Wide(char* Str, int Size)
{
char *Result = new char[Size+1]; //Выделим память под новую строку Размером Size + 1(Нулевой символ)
memset(Result, 0, Size+1); //Обнулим выделеную память
char *ptr = Str; //Заведем указатель на исходную строку
int cnt = 0; //Кол-во пробелов
//Найдем сначало кол-во пробелов
while (strstr(ptr," "))
{
ptr = strstr(ptr," ")+1; //Сдвиним указатель за первый пробел в строке на которую указывает ptr
cnt++; //Увеличим счетчик пробелов
}
if (cnt == 0) cnt++; //Подстра*цензура*ся, на тот случай если в строке нет пробелов вообще (что бы не вышло деление на нуль)
int m = (Size-strlen(Str))/cnt + 1; //Найдем кол-во пробелов которые нужно добавить
ptr = Result; //Поставим указатель на начала Результирующей строки
int allprob = cnt*m - cnt; //Кол-во пробелов, которое долны заполнить равными пробелами
int vcnt = 0; //Счетчик текущего обрабатыемого пробела
for (int i = 0; i<strlen(Str); i++) //Обойдем все исходную строку
{
if (Str[i] == ' ') //Если найден пробел, то
{
for (int j = 0; j< m; j++) //Циклом выставим нужное кол-во пробелов (m)
{
if (strlen(Result) < Size) //Но на всякий пожарный перед добавлением проверим не больше ли длина строки результата, чем заявленное кол-во символов выравнивания
{
*ptr++ = ' '; //Поставим пробел и сдвинем указатель
vcnt++;
}
if (vcnt == cnt && (strlen(Str) + allprob < Size)) //Если мы находимся на последнем пробеле и Длина строки Str(без пробелов) + длина всех равных пробелов < Size
{
//То полним в последнем пробеле нужное кол-во пробелов
for (int i = 0; i<Size - (strlen(Str) + allprob); i++)
*ptr++ = ' ';
}
}
}
else *ptr++ = Str[i]; //А если же символ не пробел просто запишим его в Result (в позицию на которую указывает указатель) и свдинем указатель
}
return Result; //Вернем результат
}
void main(void)
{
setlocale(LC_ALL,"Russian");
char buffer[1024]; //Наша вводимая строка
int Size; //Размер выравнивания
cout<< "Введите исходную строку : ";
cin.getline(buffer,1023);
cout<<"Введите кол-во пунктов выравнивания Size = ";
cin >> Size;
cout<< endl << "Результат : " << endl;
cout<<Wide(buffer,Size) << endl;
}