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

  • 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

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

  • Автор темы Автор темы 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;
}
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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

Курс AD