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

Выровнять строку на экране по ширине

R

ramrem

Необходимо выровнять строку на экране по ширине, равномерно вставляя пробелы между словами, таким образом, чтобы в каждой строке было по 60 символов и строка обязательно заканчивалась знаком препинания или пробелом. Вот свои наработки, но код не закончен и не работает даже для первого случая.
Код:
#include <stdio.h>
#include <string.h>
#include <windows.h>

void main()
{
char str[200], str1[70];
char *start, *p;
char raz[] = " .,?!;:-\0";
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
printf("Введите текст:\n");
gets_s(str);
int i , z, j, k, a=0, kp;
while (strlen(str) > 59)//пока длина строки больше 59
{
    i = 59;
    kp = 0;//количество пробелов
    str1 == " ";//очищение строки
    while (strchr(raz, str[i]) == NULL);//пока не найдем разделитель
    {
        i--;//двигаемся к началу
    }
    strncpy(str1, str, i);//копируем 59 символов в новую строку
    str1[i+1] = '\0';//заканчиваем новую строку
    strcpy(str, str + (i + 1));//копируем хвост в начало старой строки
    while (strlen(str1) < 60)//работаем с новой строкой
    {
        start = str1;//начало строки
        z = 2;
        while (str1[a] != '\0')//пока не достигнем конца строки
        {
            if (str1[a] != ' ')
                a++;//увеличиваем количество пробелов
            else
                kp++;
                a++;
            p = strchr(start, ' ');//первый пробел от начала строки
            if (p == NULL)//если пробела нет
            {
                start = str1;//начинаем заново и увеличиваем z
                z++;//количество пробелов между словами
            }
            j = p - str1;//позиция пробела
            for (k = strlen(str1); k > j; k--)//сдвиг
                str1[k] = str1[k - 1];//сдвигаем символ на предыдущий
            kp--;//уменьшаем количество пробелов
            if (kp == 0)//если пробелы закончились
                break;//прерываем цикл
            else//если пробелы не закончились
                start = p + z;//начинаем с последнего пробела в начале строки
        }
        printf("Ровный текст:\n");
        puts(str1);
    }
}

system("pause");
}
 
M

marikk

Добавил код.
Ахтунг!!! Не работает с Русским текстом, а также нет защиты от дурака.
 

Вложения

  • lab.txt
    2,4 КБ · Просмотры: 604
Мы в соцсетях:

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