Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Den468
29 / 17 / 14
Регистрация: 19.12.2018
Сообщений: 96
Завершенные тесты: 1
1

Текст по центру

26.01.2019, 19:46. Просмотров 1530. Ответов 12
Метки нет (Все метки)

Необходимо написать программу, которая принимает длинный текст и ширину поля, после чего выводит текст в поле ширины по центру. Проблема заключается в том, чтобы вывести текст по центру, пробовал сделать это с помощью функции setw(), однако никакого результата.
C++
1
2
3
4
5
6
7
8
9
void CenterString(string s, int width) {
    int a = s.size();
    while (a > width) {
        a -= width;
        s = s.insert(a, "\n");
    }
    int center = width / 2;
    cout << setw(center) << s << endl;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2019, 19:46
Ответы с готовыми решениями:

В каждой строке удалить лишние пробелы между словами и, сохраняя первоначальную длину строки, разместить текст по центру
В каждой строке удалить лишние пробелы между словами и, сохраняя первоначальную длину строки,...

Разместить текст первой строки по центру второй строки
1) Функция копирует строку в другую строку заданной длины и размещает текст первой строки по...

Функция копирует строку в другую строку заданой длины и помещает текст первой строки по центру второй строки
Ребята помогите пожалуйста с прогой оч нужно, а то я сама не могу собразить полностью и как начать...

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

Текст по центру
Как сделать текст по центру относительно осей x и y на изображении посредством GD?

12
SomniPhobia
255 / 184 / 83
Регистрация: 22.11.2017
Сообщений: 569
26.01.2019, 20:18 2
Лучший ответ Сообщение было отмечено Den468 как решение

Решение

Привет!
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <windows.h>
#include <string>
#include <sstream>
#include <algorithm>
#include <iomanip>
 
using namespace std;
 
void GetConsBuff(int &, int &);
 
void CenterString(string &, const size_t &);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("color 0A");
    
    cout << "Введите текст" << endl;
    string s;
    getline(cin, s);
    CenterString(s, 25u);
 
    system("pause");
    return 0;
}
 
//Получение размеров окна консоли без прокрутки
void GetConsBuff(int &x, int &y)
{
 
    HANDLE hWndConsole;
    if (hWndConsole = GetStdHandle(-12))
    {
        CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
        if (GetConsoleScreenBufferInfo(hWndConsole, &consoleInfo))
        {
            x = consoleInfo.srWindow.Right - consoleInfo.srWindow.Left + 1;
            y = consoleInfo.srWindow.Bottom - consoleInfo.srWindow.Top + 1;
        }
        else
            printf("Error: %d\n", GetLastError());
    }
    else
        printf("Error: %d\n", GetLastError());
}
 
void CenterString(string &s, const size_t &width)
{
    int buffer_x_size, buffer_y_size;
    GetConsBuff(buffer_x_size, buffer_y_size);
    size_t left_bord = (buffer_x_size - width) / 2.;
    for (;;)
    {
        cout << setw(left_bord) << "";
        cout << s.substr(0u, width) << endl;
        s.erase(s.begin(), s.begin() + (s.size() < width ? s.size() : width));
        if (s.empty())
        {
            break;
        }
    }
}
1
Den468
29 / 17 / 14
Регистрация: 19.12.2018
Сообщений: 96
Завершенные тесты: 1
26.01.2019, 21:09  [ТС] 3
Спасибо, всё работает. Однако для новичка сложно, как по мне. Да и лично я ещё не знаком со всем этим. Это задание было мною взято из темы "символьные строки". Если не сложно, можете подробно объяснить написанную Вами программу?
0
Verevkin
2196 / 1168 / 295
Регистрация: 12.03.2015
Сообщений: 6,611
27.01.2019, 00:36 4
Цитата Сообщение от Den468 Посмотреть сообщение
Однако для новичка сложно, как по мне.
Вот вариант попроще.
C++
1
2
3
4
5
6
7
8
9
// Центрирование строки относительно ширины поля для её вывода.
// Возвращает количество символов - смещение влево первого символа строки,
// чтобы при выводе строка оказалась в середине поля для её вывода
char CenterString(string S, char Width)
{
  int L = strlen(S);
  if (L >= Width)  return 0; // Если строка по длине равна или больше области вывода
  return (Width - L) / 2;
}
1
27.01.2019, 00:36
SomniPhobia
255 / 184 / 83
Регистрация: 22.11.2017
Сообщений: 569
27.01.2019, 08:57 5
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//Подключаем библиотеки
#include <iostream>
#include <windows.h>
#include <string>
#include <sstream>
#include <algorithm>
#include <iomanip>
 
using namespace std;
 
//Функция, находящая размер окна консоли
void GetConsBuff(int &, int &);
 
//Функция выводящая текст по центру в поле указанного размера
void CenterString(string &, const size_t &);
 
int main()
{
//Для поддержки русского языка в консоле
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("color 0A");
    
    cout << "Введите текст" << endl;
    string s;
//Считывание строки с консоли вместе с пробелами до первого \n
    getline(cin, s);
    CenterString(s, 25u);
 
    system("pause");
    return 0;
}
 
//Получение размеров окна консоли без прокрутки
void GetConsBuff(int &x, int &y)
{
 //Объявляю дескриптор объекта
    HANDLE hWndConsole;
//Инициализация дескриптора
//Теперь hWndConsole позволяет обратиться к консоле
    if (hWndConsole = GetStdHandle(-12))
    {
//Переменная, которая будет хранить информацию о консоле
        CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
//Просим заполнить информацию о консоле из дескриптора
        if (GetConsoleScreenBufferInfo(hWndConsole, &consoleInfo))
        {
//Ищем размеры окна консоли
//x - горизонт, y - вертикаль
            x = consoleInfo.srWindow.Right - consoleInfo.srWindow.Left + 1;
            y = consoleInfo.srWindow.Bottom - consoleInfo.srWindow.Top + 1;
        }
        else
            printf("Error: %d\n", GetLastError());
    }
    else
        printf("Error: %d\n", GetLastError());
}
 
void CenterString(string &s, const size_t &width)
{
//Получаем размеры окна консоли
    int buffer_x_size, buffer_y_size;
    GetConsBuff(buffer_x_size, buffer_y_size);
//Устанавливаем левый отступ
    size_t left_bord = (buffer_x_size - width) / 2.;
//Бесконечный цикл
    for (;;)
    {
//Левый отступ в деле
//cout.fill(' '); по умолчанию
        cout << setw(left_bord) << "";
//Выделение подстроки и вывод её на консоль
        cout << s.substr(0u, width) << endl;
//Удаление из строки той части, что вывели на консоль
//(s.size() < width ? s.size() : width) чтобы не выйти за пределы контейнера - проверка
        s.erase(s.begin(), s.begin() + (s.size() < width ? s.size() : width));
//Если строку всю потратили - заканчиваем бесконечный цикл break;
        if (s.empty())
        {
            break;
        }
    }
}
1
Den468
29 / 17 / 14
Регистрация: 19.12.2018
Сообщений: 96
Завершенные тесты: 1
27.01.2019, 16:05  [ТС] 6
При компиляции программы ошибка.
"Не существует функции преобразования из std::string в const char"
Ошибка здесь:
C++
1
int L = strlen(S);
0
Verevkin
2196 / 1168 / 295
Регистрация: 12.03.2015
Сообщений: 6,611
27.01.2019, 16:45 7
Цитата Сообщение от Den468 Посмотреть сообщение
При компиляции программы ошибка.
"Не существует функции преобразования из std::string в const char"
Ошибка здесь:
Сорри, мой косяк. Пиши так:
C++
1
2
3
4
5
6
7
8
9
// Центрирование строки относительно ширины поля для её вывода.
// Возвращает количество символов - смещение влево первого символа строки,
// чтобы при выводе строка оказалась в середине поля для её вывода
char CenterString(char* S, char Width)
{
  int L = strlen(S);
  if (L >= Width)  return 0; // Если строка по длине равна или больше области вывода
  return (Width - L) / 2;
}
0
Den468
29 / 17 / 14
Регистрация: 19.12.2018
Сообщений: 96
Завершенные тесты: 1
27.01.2019, 21:16  [ТС] 8
К сожалению, программа не работает...
Теперь ошибка:
аргумент типа const char* не совместим с char* и при попытке переделать программу в:
C++
1
2
3
4
5
6
char CenterString(char* S, char Width)
{
    int L = strlen(S);
    if (L >= Width)  return 0; // Если строка по длине равна или больше области вывода
    return (Width - L) / 2;
}
Ничего не происходит. Программа компилируется, но там ничего нет
0
Verevkin
2196 / 1168 / 295
Регистрация: 12.03.2015
Сообщений: 6,611
27.01.2019, 21:31 9
Цитата Сообщение от Den468 Посмотреть сообщение
Теперь ошибка:
аргумент типа const char* не совместим с char*
Да ёмаё, почему у меня-то работает? Что я делаю не так?!
C++
1
2
3
4
5
6
char CenterString(const char* S, char Width)
{
  int L = strlen(S);
  if (L >= Width)  return 0; // Если строка по длине равна или больше области вывода
  return (Width - L) / 2;
}
Как ты используешь функцию в программе?
0
Den468
29 / 17 / 14
Регистрация: 19.12.2018
Сообщений: 96
Завершенные тесты: 1
28.01.2019, 22:18  [ТС] 10
Вызываю функцию из main() таким образом:
const char* S = "тут пишу длинный текст"
C++
1
2
3
4
int main()
{
    CenterString(S, 60);
}
0
Verevkin
2196 / 1168 / 295
Регистрация: 12.03.2015
Сообщений: 6,611
28.01.2019, 22:23 11
Цитата Сообщение от Den468 Посмотреть сообщение
Вызываю функцию из main() таким образом:
const char* S = "тут пишу длинный текст"
Да ёмаё, это ж функция! Она не модифицирует твою строку, которую ты передаёшь в неё.

Текст по центру
0
Den468
29 / 17 / 14
Регистрация: 19.12.2018
Сообщений: 96
Завершенные тесты: 1
31.01.2019, 11:44  [ТС] 12
Да, точно. Прости за мою невнимательность
0
Verevkin
2196 / 1168 / 295
Регистрация: 12.03.2015
Сообщений: 6,611
31.01.2019, 12:34 13
Цитата Сообщение от Den468 Посмотреть сообщение
Да, точно. Прости за мою невнимательность
Я тебя прощаю.
0
31.01.2019, 12:34
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2019, 12:34

Текст по центру
Добрый вечер Есть сайт http://testhtml.besaba.com/ Но текст позиционирован абсалютом, так как без...

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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