Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выровнять строку на экране по ширине на Си 
:(
    Опции темы
ramona
Дата 10.4.2017, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



Необходимо выровнять строку на экране по ширине, равномерно вставляя пробелы между словами, таким образом, чтобы в каждой строке было по 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] == ' ')
                    kp++;//увеличиваем количество пробелов
                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");
}


Это сообщение отредактировал(а) ramona - 11.4.2017, 18:43
PM MAIL   Вверх
Dov
Дата 11.4.2017, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



посмотри здесь


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
akizelokro
Дата 11.4.2017, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Код

str1 == " ";//очищение строки



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ramona
Дата 11.4.2017, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



akizelokro, что это значит?
PM MAIL   Вверх
akizelokro
Дата 11.4.2017, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



== это не оператор присваивания, это оператор сравнения. А как я понял, вы собираетесь в strl[i] записать символ пробела или сделать что-нибудь ещё.


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ramona
Дата 11.4.2017, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



akizelokro, если записать str1=" ", компилятор выдает ошибку и данная строка не выполняет своей функции
PM MAIL   Вверх
ramona
Дата 11.4.2017, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



akizelokro, предлагаете записать как strcpy(str1," ")?
PM MAIL   Вверх
akizelokro
Дата 11.4.2017, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Если вам надо очистить строку, то
Код

str1[0] = '\0';

Я не смотрел алгоритм дальше этого места. Вот
Код

        while (strchr(raz, str[i]) == NULL);//пока не найдем разделитель
        {
            i--;//двигаемся к началу
        }


если разделителя нет в строке, то i может уйти в минусовые значения. Вам надо ограничить i
Код

        while (strchr(raz, str[i]) == NULL);//пока не найдем разделитель
        {
            if(i == 0)
                    break;
            i--;//двигаемся к началу
        }

Может быть, ещё где-то ошибки.

Это сообщение отредактировал(а) akizelokro - 11.4.2017, 20:05


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ramona
Дата 11.4.2017, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



akizelokro, Думаю в этом цикле нужно добавить a++, но не знаю куда, или заменить на while(1)
Цитата(ramona @ 10.4.2017,  19:33)

Код

            while (str1[a] != '\0')//пока не достигнем конца строки



Это сообщение отредактировал(а) ramona - 11.4.2017, 20:24
PM MAIL   Вверх
ramona
Дата 11.4.2017, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



akizelokro, Где можно посчитать количество пробелов kp в строке?
PM MAIL   Вверх
akizelokro
Дата 11.4.2017, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(ramona @  11.4.2017,  20:42 Найти цитируемый пост)
Где можно посчитать количество пробелов kp в строке? 

Надо запускать дебаггер в режиме отладки или, есть проблемы с изучением дебаггера, можно выводить значение на экран.
Для целых значений 

Код

printf("%d \n", kp);

Не забываем добавить 

Код

#include <stdlib.h>




--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ramona
Дата 11.4.2017, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



akizelokro, Имелось ввиду куда можно поместить kp++, сделать условие после while(str1[a]!='\0') или это осуществляется как-то иначе?

PM MAIL   Вверх
akizelokro
Дата 11.4.2017, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Инкремент a (a++) наверно нужно делать в конце цикла while, нет времени вникать.



--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
ramona
Дата 11.4.2017, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.3.2017

Репутация: нет
Всего: нет



akizelokro, А что же делать с количеством пробелов kp?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.