• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Задача: Форматирование строки (выравнивание текста)

  • Автор темы Автор темы Guest
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

Произвести выравнивание по правому краю введенного текста, для чего к каждой строке применить функцию WIDE(str,k), которая равномерно вставляет пробелы между словами так, чтобы длина строки str стала равной k. (Величина k должна быть больше длины самой длинной строки текста.)

заранее спасибо
 
Вообщем если все недочету учесть, то получиться примерно вот так
C++:
/*
Произвести выравнивание по ШИРИНЕ введенного текста, для чего к каждой строке применить функцию 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;
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!