Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

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

void main()
{
    char str[200], str1[70];
    char *start=str1, *p;
    char raz[] = " .,?!;:-";
    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--;//двигаемся к началу
                kp++;
            }
            strncpy(str1, str, i);//копируем 59 символов в новую строку
            str1[i + 1] = '';//заканчиваем новую строку
            strcpy(str, str + (i + 1));//копируем хвост в начало старой строки
            while (strlen(str1) < 60)//работаем с новой строкой
            {
                z = 2;
                while (1)//пока не достигнем конца строки
                {
                    p = strchr(start, ' ');//первый пробел от начала строки
                    if (p == NULL)//если пробела нет
                    {
                        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;//начинаем с последнего пробела в начале строки
                }
                puts(str1);
            }
        }
    system("pause");
}
392
13 апреля 2017 года
cronya
421 / / 03.01.2009
ВЫ пример приведите в строковом значении, например:
 
Код:
Привет мир! Жизнь прекрасна.
Получилось, где * - пробел
 
Код:
***Привет***мир!***Жизнь***прерасна***
Опишите, нужно ли пробелы вставлять перед первым словом, сколько пробелов вставлять после последнего слова. Ничего не понятно у вас как то получается.
Вся идея сводиться к тому, что у вас в строке почти всегда будет получаться по 2 токена, задание в универе как всегда для изобретения велосипеда.
И я думаю, вам следует сначала выделить токены из строки в массив таким образом
 
Код:
setlocale(LC_ALL, "ru-Ru");
    char Text[] = "Привет мир! Сегодня чудесный день, не правда ли? Можно сходить в кафе или погулять на природе. Всем удачи.";
    char delim[] = " ";
    cout << Text << endl;
    char* ptr = strtok(Text, delim);   
    while (ptr != NULL)
    {
        ptr = strtok(NULL, delim);     
    }
а потом написать алгоритм, который соединит токены с нужным количеством пробелов
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог