Выровнять текст на экране по правому краю - 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');
    }
}

Объяснение кода листинга программы

  1. В функции main определен массив s, содержащий текст, который необходимо выровнять по правому краю.
  2. В функции rightAlignment определены следующие переменные:
    • first, last, end - указатели на начало, конец и один байт после конца строки str.
    • delim[] - массив, содержащий разделители (пробел, запятая, точка, точка с запятой, двоеточие, точка и т.д.).
    • i - счетчик для цикла.
    • flag - флаг, используемый в циклах.
    • count - счетчик пробелов.
    • finish - флаг, указывающий на окончание процесса выравнивания.
  3. В цикле while происходит следующее:
    • last увеличивается на N, чтобы переместиться вправо на N символов.
    • Если last становится больше или равным end, то last уменьшается на 1, чтобы избежать выхода за пределы строки, и флаг finish устанавливается в 1, указывая на окончание процесса выравнивания.
    • Флаг flag устанавливается в 0, чтобы начать поиск разделителя.
    • В цикле while происходит поиск разделителя. Если он найден, то флаг flag устанавливается в 1 и цикл прерывается. Если разделитель не найден, то last уменьшается на 1.
    • Переменная count инициализируется, чтобы начать отсчет пробелов.
    • В цикле while пробелы выводятся на экран.
    • Переменная first инициализируется, чтобы начать перемещение по строке от начала к концу.
  4. В цикле while выводится выравненный текст.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4 из 5
Похожие ответы