Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
#1

Ограничение ширины строки при выводе в консоль - C++

31.10.2013, 11:09. Просмотров 1269. Ответов 26
Метки нет (Все метки)

Класс выводит строку в консоли.
Как сделать, чтобы ширина выводимых строк была равна characterWidth = 40,
т.е. после 40 символов был перенос на новую строку?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <iostream>
 
class StringProcessing {
  public:
      StringProcessing() : characterWidth(40),
                     textToBeFormatted("NULL") {}
      
      inline void StringProcessing::initString() {
          textToBeFormatted =
              "text    some text   some text some text   some text some text"
              "text some text  some text    some text some text some text"
              "text    some      text some    text some   text some text some text"
              "text some  text some    text some    text some text some text"
              "text   some     text some text some   text some text some text";
      }
 
      inline void displayString()
        { std::cout << textToBeFormatted << std::endl; }
  private:    
      int characterWidth;
      std::string textToBeFormatted;
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2013, 11:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ограничение ширины строки при выводе в консоль (C++):

Пропадают строки при выводе в консоль - C++
куда-то пропадают строки. например: for(int q=0;q&lt;10;q++){ cout&lt;&lt;q&lt;&lt;&quot;-q&quot;; for(int w=0;w&lt;10;w++){cout&lt;&lt;w&lt;&lt;&quot;-w&quot;; ...

Кирилица отображается нормально при выводе из программы, но иероглифы при вводе в консоль - C++
Что надо подключить что бы в консоли писать русскими буквами? cin &gt;&gt; kol; cin &gt;&gt; x; cout &lt;&lt; &quot;У вас есть &quot; &lt;&lt; kol &lt;&lt; &quot; &quot; &lt;&lt; x; ...

Матрицы в си++ реверс при выводе на консоль - C++
Мне нужно чтобы заданная матрица выводилась на экран не с первого элемента, а с последнего, как так сделать ? #include &lt;iostream&gt; ...

Кодировка символов при выводе в консоль. - C++
Код #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;sstream&gt; #include...

Интервал времени при выводе в консоль - C++
Здравствуйте,пару дней назад подумал о том, можно ли сделать вывод в консоли информации через &quot;cout&quot; по времени. К примеру у меня есть не...

Необработанное исключение по адресу при выводе на консоль - C++
Доброго времени суток. #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class YearData { public: int day; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
31.10.2013, 13:32 #16
Цитата Сообщение от dimakozyr Посмотреть сообщение
Прикольно, все работает
Но она еще не решена, я сейчас мучаюсь, чтоб слова не обрезались
Да как два пальца (только без промежуточных итераторов здесь не обойтись):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    void displayString()
    {
        string::iterator strIter = textToBeFormatted.begin();
        string::iterator temp = strIter;
        while(strIter!= textToBeFormatted.end())
        {
            cout.put(*strIter++);
            if (!((strIter - temp) % characterWidth))
            {
                while((*strIter != ' ' )
                        &&(strIter!= textToBeFormatted.end()))
                    cout.put(*strIter++);
                temp = strIter;
                cout.put('\n');
            }
        }
    }
Добавлено через 4 минуты
p.s. Проблема только с пробелами. Вопрос в том нужно ли инрементировать итератор или нет, но это уже зависит от того как вам нужно. Однако это решается просто (при условии, что пробел один):
C++
1
temp = ++strIter;
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
31.10.2013, 13:35  [ТС] #17
Цитата Сообщение от Ilot Посмотреть сообщение
Да как два пальца (только без промежуточных итераторов здесь не обойтись):
Да, круто. Осталось доделать выравнивание по ширине, но это уже не так сложно
0
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
31.10.2013, 13:41 #18
Цитата Сообщение от dimakozyr Посмотреть сообщение
Да, круто. Осталось доделать выравнивание по ширине, но это уже не так сложно
Благодарю. Четвертый день изучаю STL .
Мне интересно мнение опытных программистов. Сойдет ли такой код при приеме на работу или все-таки он пока корявый?
1
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
31.10.2013, 13:45  [ТС] #19
Цитата Сообщение от Ilot Посмотреть сообщение
Четвертый день изучаю STL .
Четвертый? Я уже 100 страниц Мюссера прочитал, но до сих пор не шарю

Цитата Сообщение от Ilot Посмотреть сообщение
Сойдет ли такой код при приеме на работу или все-таки он пока корявый?
Вполне, крутой код
0
Ilot
31.10.2013, 13:55
  #20

Не по теме:

Цитата Сообщение от dimakozyr Посмотреть сообщение
Четвертый? Я уже 100 страниц Мюссера прочитал, но до сих пор не шарю
Ну так у него основной материал начинается где-то с 5й главы. Так что пока не познакомитесь с алгоритмами не фига не будет понятно.
А вы С++ по чем учили? Мне после Лафоре впринципе по большей части все понятно. Вот только сегодня утром поздно проснулся не успел почитать, а на работе вникнуть не получается. Обычно на работе я пишу код, а дома читаю. А тут такая засада...

0
dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
31.10.2013, 14:01  [ТС] #21
Цитата Сообщение от Ilot Посмотреть сообщение
А вы С++ по чем учили? Мне после Лафоре впринципе по большей части все понятно.
Да я тоже по Лафоре, Страуструпу. Купил Седжвика, все никак не осилю, уж очень он сложный
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
31.10.2013, 14:10 #22
Я бы сделал как-то так. Не очень красиво конечно, можно сделать лучше. Использую допущение, что слова разделяются только пробелом.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class StringProcessing 
{
  public:
      StringProcessing() : characterWidth(40),
                     textToBeFormatted("NULL") {}
      
      inline void initString() {
          textToBeFormatted = "text    some text   some text some text   some text some text"
              "text some text  some text    some text some text some text"
              "text    some      text some    text some   text some text some text"
              "text some  text some    text some    text some text some text"
              "text   some     text some text some   text some text some text";
      }
 
      inline void displayString()
      {
         const std::string& s = textToBeFormatted;
         const int& width = characterWidth;
         for (int current = 0; current < s.length();)
         {
            if (s.length() < width)
            {
               output(s);
               break;
            }
            if (s.length() - current < width)
            {
               output(s.substr(current));
               break;
            }
            std::string substr = s.substr(current, width);
            current += width;
            size_t space = substr.rfind(' ');
            if (space != std::string::npos && (substr[width - 1] != ' ' &&
               (s.length() > current && s[current] != ' ')))
            {
               current -= width - space - 1;
               substr = substr.substr(0, space + 1);
            }
            output(substr);
         }
      }
  private:
      inline void output(const std::string& s)
      {
         std::cout << std::setfill(' ') << std::right << std::setw(characterWidth) << s << std::endl;
      }
      int characterWidth;
      std::string textToBeFormatted;
};
http://ideone.com/pK0str
1
Ilot
Модератор
Эксперт С++
1811 / 1168 / 229
Регистрация: 16.05.2013
Сообщений: 3,082
Записей в блоге: 5
Завершенные тесты: 1
31.10.2013, 14:22 #23
ForEveR, сразу вопрос:
C++
1
2
const std::string& s = textToBeFormatted;
const int& width = characterWidth;
Это вы сделали что бы не случайно не изменить поля класса. А не лучше ли в таком случае сделать ф-ю константной?
C++
1
      inline void displayString() const
p.s. Мне кажется компилятор проигнорирует встаивание....
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,542
Завершенные тесты: 3
31.10.2013, 14:25 #24
Ilot, Скорее проигнорирует. Нет, я сделал это для того, чтобы мне было удобнее писать честно говоря. Можно сделать и константной (скорее даже нужно).
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
31.10.2013, 14:35 #25
ForEveR, так ведь метод определенный непосредственно в классе - неявно встраиваемый. inline не нужен.
0
ShadowFirst
55 / 48 / 1
Регистрация: 31.10.2013
Сообщений: 161
31.10.2013, 14:42 #26
Я конечно не силен в STL и вместо программы попробую описать алгоритм как я это вижу. В STL вроде должна быть функция у string под название split которая должна возвращать list <string> кажется так. У каждого слова есть своя длина. Потом нужно пройтись по этому списку возвращая длину каждого слова и плюс 1 на пробел, когда длина следующего слова будет больше 40, то что накопилось, предположим 36, получаем 4 пробела нужно добавить и добавляем их в нужные места.
0
eocron
Кактус
66 / 66 / 6
Регистрация: 23.05.2012
Сообщений: 343
31.10.2013, 14:42 #27

Не по теме:

Скорее всего, это просто привычка.



Split есть в C#. В STL его нет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2013, 14:42
Привет! Вот еще темы с ответами:

Теряется часть информации при выводе в консоль - C++
Я пишу игру Пьяницы, и в цикле происходит вывод информации о номинале карты, сравнении этой карты с другой и т.д. Так получается, что...

Заставить консоль всплывать поверх окон при выводе новой информации - C++
Добрый день, Подскажите как реализовать всплытие консоли поверх всех окон? Пишу программу для тестирования, которая будет рыться...

При выводе на консоль выделить заданную последовательность чисел в матрице скобками - C++
Помогите сделать скобки, в формате как на рисунке: // Matrisa.cpp: определяет точку входа для консольного приложения. // ...

Как убрать лишние символы при выводе в консоль списка файлов? - C++
Поясните, пожалуйста. Собираю кроссплатформенные методы, для работы с файлами. Взял для разбора такой метод. Всё работает, только вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
31.10.2013, 14:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru