Выровнять текст на экране по правому краю
по правому краю, так что бы в каждой строке было 60 символов и
каждая строка заканчивалась знаком препинания или пробелом.
Выравнивание осуществить, вставляя дополнительные пробелы
между словами (равномерно по всей строке).
Очень просто. Парсишь строку, сохраняя каждый раз позицию предыдущего слова. Если текущий символ в строке — знак препинания или пробел, проверяешь, меньше ли длина получившейся строки, чем 60. Если да, то продолжаешь, если нет, то обрезаешь по предыдущему слову и повторяешь всё заново, не забывая сбросить счётчик символов.
Цитата: @pixo $oft
обрезаешь по предыдущему слову и повторяешь всё заново
А куда копировать эту новую строку?
Код:
#include <iostream>
#include <cstring>
/*
Текст записан одной длинной строкой. Выровнять текст на экране
по правому краю, так что бы в каждой строке было 60 символов и
каждая строка заканчивалась знаком препинания или пробелом.
Помогите, как решить в строках?
*/
void printRightJustified(const char * str, int maxChars = 60) {
int len = strlen(str);
for (int b = 0, e = 0, t; b < len ; b = e) {
// индекс последнего символа
e = ( b + maxChars > len ) ? len : b + maxChars;
// ищем символ, который удовлетворяет критериям окончания строки
for ( t = e-1; t > b; --t) {
if (ispunct(str[t]) || str[t] == ' ') break;
}
// если такой символ найден, то его индекс будет конечным для данной строки
if (t > b) e = t+1;
// печатаем пробелы
for (int i = 0, w = maxChars-(e-b); i < w; ++i) std::cout << " ";
// печатаем символы из строки
for (int i = b; i < e; ++i) std::cout << str[i];
std::cout << std::endl;
}
}
int main() {
char str[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
printRightJustified(str, 30); std::cout << std::endl;
printRightJustified(str, 60); std::cout << std::endl;
printRightJustified(str, 90); std::cout << std::endl;
}
#include <cstring>
/*
Текст записан одной длинной строкой. Выровнять текст на экране
по правому краю, так что бы в каждой строке было 60 символов и
каждая строка заканчивалась знаком препинания или пробелом.
Помогите, как решить в строках?
*/
void printRightJustified(const char * str, int maxChars = 60) {
int len = strlen(str);
for (int b = 0, e = 0, t; b < len ; b = e) {
// индекс последнего символа
e = ( b + maxChars > len ) ? len : b + maxChars;
// ищем символ, который удовлетворяет критериям окончания строки
for ( t = e-1; t > b; --t) {
if (ispunct(str[t]) || str[t] == ' ') break;
}
// если такой символ найден, то его индекс будет конечным для данной строки
if (t > b) e = t+1;
// печатаем пробелы
for (int i = 0, w = maxChars-(e-b); i < w; ++i) std::cout << " ";
// печатаем символы из строки
for (int i = b; i < e; ++i) std::cout << str[i];
std::cout << std::endl;
}
}
int main() {
char str[] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
printRightJustified(str, 30); std::cout << std::endl;
printRightJustified(str, 60); std::cout << std::endl;
printRightJustified(str, 90); std::cout << std::endl;
}