Выровнять текст на экране по правому краю - C (СИ)
Формулировка задачи:
Текст записан одной длинной строкой. Выровнять текст на экране
по правому краю, так что бы в каждой строке было 60 символов и
каждая строка заканчивалась знаком препинания или пробелом.
Помогите, как решить?
Решение задачи: «Выровнять текст на экране по правому краю»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
#define N 60
void rightAlignment(char* );
int main()
{
char s[] = "What can you say about a twenty-five-year-old girl who died?That she was beautiful.And brilliant.That "
"she loved Mozart and Bach.And the Beatles.And me.Once,when she specifically jumped me with those musical"
" types, I asked her what the order was, and she replied, smiling.At the time I smiled too. But now I sit"
" and wonder whether she was listing me by my first name - in which case I would trail Mozart - or by my"
" last name, in which case I would edge in there between Bach and the Beatles. Either way I don't come first,"
" which for some stupid reason bothers hell out of me, having grown up with the notion that I always had to"
" be number one. Family heritage, don't you know?";
rightAlignment(s);
return 0;
}
void rightAlignment(char* str)
{
char *first, *last, *end;
char delim[] = " ,.;:'!?";
int i = 0, flag = 0, count = 0, finish = 0;
end = &str[strlen(str)];
last = first = str;
while(!finish){
last += N;
if(last >= end){
last = end - 1;
finish = 1;
}
flag = 0;
while(!flag && !finish){
for(i = 0; delim[i]; i++)
if(*last == delim[i]){
flag = 1;
break;
}
if(!flag)
last--;
}
count = 0;
while(last - first + count++ < N)
putchar(' ');
while(first <= last)
putchar(*first++);
putchar('\n');
}
}
Объяснение кода листинга программы
- В функции
mainопределен массивs, содержащий текст, который необходимо выровнять по правому краю. - В функции
rightAlignmentопределены следующие переменные:first,last,end- указатели на начало, конец и один байт после конца строкиstr.delim[]- массив, содержащий разделители (пробел, запятая, точка, точка с запятой, двоеточие, точка и т.д.).i- счетчик для цикла.flag- флаг, используемый в циклах.count- счетчик пробелов.finish- флаг, указывающий на окончание процесса выравнивания.
- В цикле
whileпроисходит следующее:lastувеличивается наN, чтобы переместиться вправо наNсимволов.- Если
lastстановится больше или равнымend, тоlastуменьшается на 1, чтобы избежать выхода за пределы строки, и флагfinishустанавливается в 1, указывая на окончание процесса выравнивания. - Флаг
flagустанавливается в 0, чтобы начать поиск разделителя. - В цикле
whileпроисходит поиск разделителя. Если он найден, то флагflagустанавливается в 1 и цикл прерывается. Если разделитель не найден, тоlastуменьшается на 1. - Переменная
countинициализируется, чтобы начать отсчет пробелов. - В цикле
whileпробелы выводятся на экран. - Переменная
firstинициализируется, чтобы начать перемещение по строке от начала к концу.
- В цикле
whileвыводится выравненный текст.