С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/222: Рейтинг темы: голосов - 222, средняя оценка - 4.63
30 / 18 / 14
Регистрация: 19.12.2018
Сообщений: 104
1

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

26.01.2019, 19:46. Показов 40034. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо написать программу, которая принимает длинный текст и ширину поля, после чего выводит текст в поле ширины по центру. Проблема заключается в том, чтобы вывести текст по центру, пробовал сделать это с помощью функции 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2019, 19:46
Ответы с готовыми решениями:

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

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

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

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

13
601 / 438 / 136
Регистрация: 22.11.2017
Сообщений: 1,385
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;
        }
    }
}
2
30 / 18 / 14
Регистрация: 19.12.2018
Сообщений: 104
26.01.2019, 21:09  [ТС] 3
Спасибо, всё работает. Однако для новичка сложно, как по мне. Да и лично я ещё не знаком со всем этим. Это задание было мною взято из темы "символьные строки". Если не сложно, можете подробно объяснить написанную Вами программу?
0
Злостный нарушитель
9613 / 5204 / 1187
Регистрация: 12.03.2015
Сообщений: 24,568
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
601 / 438 / 136
Регистрация: 22.11.2017
Сообщений: 1,385
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
30 / 18 / 14
Регистрация: 19.12.2018
Сообщений: 104
27.01.2019, 16:05  [ТС] 6
При компиляции программы ошибка.
"Не существует функции преобразования из std::string в const char"
Ошибка здесь:
C++
1
int L = strlen(S);
0
Злостный нарушитель
9613 / 5204 / 1187
Регистрация: 12.03.2015
Сообщений: 24,568
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
30 / 18 / 14
Регистрация: 19.12.2018
Сообщений: 104
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
Злостный нарушитель
9613 / 5204 / 1187
Регистрация: 12.03.2015
Сообщений: 24,568
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
30 / 18 / 14
Регистрация: 19.12.2018
Сообщений: 104
28.01.2019, 22:18  [ТС] 10
Вызываю функцию из main() таким образом:
const char* S = "тут пишу длинный текст"
C++
1
2
3
4
int main()
{
    CenterString(S, 60);
}
0
Злостный нарушитель
9613 / 5204 / 1187
Регистрация: 12.03.2015
Сообщений: 24,568
28.01.2019, 22:23 11
Цитата Сообщение от Den468 Посмотреть сообщение
Вызываю функцию из main() таким образом:
const char* S = "тут пишу длинный текст"
Да ёмаё, это ж функция! Она не модифицирует твою строку, которую ты передаёшь в неё.

Текст по центру
0
30 / 18 / 14
Регистрация: 19.12.2018
Сообщений: 104
31.01.2019, 11:44  [ТС] 12
Да, точно. Прости за мою невнимательность
0
Злостный нарушитель
9613 / 5204 / 1187
Регистрация: 12.03.2015
Сообщений: 24,568
31.01.2019, 12:34 13
Цитата Сообщение от Den468 Посмотреть сообщение
Да, точно. Прости за мою невнимательность
Я тебя прощаю.
0
0 / 0 / 0
Регистрация: 14.04.2023
Сообщений: 1
14.04.2023, 18:42 14
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <iomanip>
 
void printOnCenter(string message)
{
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
        int width = csbi.srWindow.Right - csbi.srWindow.Left + 1;
        int length = message.length();
        cout << setw((width - length) / 2 + length) << message << endl;
}
Тут мы сначала получаем ширину консоли и длину текста, а затем делаем выравнивание с помощью setw()
0
14.04.2023, 18:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2023, 18:42
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru