Выровнять текст на экране по правому краю - 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
выводится выравненный текст.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д