Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/55: Рейтинг темы: голосов - 55, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 08.05.2020
Сообщений: 10

Выравнивание текста по правому краю (вставка пробелов)

02.02.2021, 15:52. Показов 11576. Ответов 9

Студворк — интернет-сервис помощи студентам
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
#include <stdio.h>
#include <string.h>
 
#define MAXSIZE 256
 
int main()
{
    char str[MAXSIZE], str1[MAXSIZE];
    int i,k=0;
    printf("Vvedite stroku: ");
    gets(str);
    for(i=0; i<strlen(str); i++)
    {
        if(str[i]=='a')
        {
            str1[k] = 'a';
            str1[k + 1]=' ';
            ++k;
        }
        else
            str1[k]=str[i];
           
 
           k++;
    }
    printf("\n");
    puts(str1);
    return 0;
}


Помогите пожалуйста доработать программу чтоб по правому краю и вставляла пробелы ,но у меня работает только с символом a
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.02.2021, 15:52
Ответы с готовыми решениями:

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

Выравнивание по правому краю введенного текста
Может кто подсказать, правильно ли сделал? Произвести выравнивание по правому краю введенного текста, для чего к каждой строке...

Произвести выравнивание по правому краю введенного текста
помогите пожалуйста!!!! срочно надо!! задача №1. Произвести выравнивание по правому краю введенного текста, для чего к каждой...

9
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
02.02.2021, 16:28
Цитата Сообщение от FAUST3561 Посмотреть сообщение
чтоб по правому краю
Пусть кол-во символов одной строки консоли - 40, тогда мы получаем выравнивание таким образом

-Получаем строку
-Считаем кол-во символов
-Отнимаем это кол-во символов от полной строки, это будет кол-во пробелов (40)
-Заполняем всё пробелами
-Выводим строку
Но в С++ это уже решили
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iomanip>
#include <iostream>
#include <string>
 
void printright(const std::string & str)
{
    const size_t console_max_len = 40;
    std::cout << std::setw(console_max_len) << str;
}
 
int main()
{
    printright("Your text:");
    std::string str;
    std::getline(std::cin, str);
    printright(str);
    std::cout << std::endl;
    system("pause");
}
если вы хотите полноценное выравнивание - мне кажется нужно лезть в системное API
1
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848
02.02.2021, 16:31
FAUST3561, меня смущает сама цель сего создания, если это уже давно реализовано в том же ворде
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
02.02.2021, 16:33
FAUST3561, несколько моментов для уточнения:
1) зачем такой длинный массив? Вы собрались его выводить в одну строку экрана? задайте те же 41 (+ терминальный нуль)
2) где терминальный нуль в конце строки?
3) уточните, куда Вы собрались вставлять пробелы? После каждого символа?
4) в Си также есть возможность форматировать при выводе:
C
1
    printf("%40s\n", str);
0
0 / 0 / 0
Регистрация: 08.05.2020
Сообщений: 10
02.02.2021, 17:00  [ТС]
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
#include <stdio.h>
#include <string.h>
 
 
 
size_t wordsCount(const char *str){
    const char *p;
    size_t count, inword;
    
    if ( !str || !(*str) )
        return 0;
    
    inword = count = 0;
    for ( p = str; *p; p++ ){
        if ( *p != ' ' ){
            if ( !inword ){
                inword = 1;
                count++;
            }
        }
        else {
            inword = 0;
        }
    }
    return count;
}
 
int main(void){
    char buf[ROW_LEN + 2]; /* "\n\0" */
    char spc[ROW_LEN], espc[ROW_LEN], *pWrd;
    size_t buf_len, nwords, spaces_needed, spaces_between_words, extra_spaces;
    
    while ( 1 ){
        printf("Enter string (single enter - exit): ");
        fgets(buf, ROW_LEN + 2, stdin);
        if ( *buf == '\n' )
            break;
        buf_len = strlen(buf);
        if ( buf[buf_len - 1] == '\n' )
            buf[--buf_len] = '\0';
        
        if ( buf_len == ROW_LEN ){ /* просто вывести строку */
            printf("%s\n", buf);
            continue;
        }
        
        nwords = wordsCount(buf);
        if ( !nwords ){
            printf("Empty string or some other error!\n");
            continue;
        }
        if ( nwords == 1 ){
            printf("Only one word in string!\n");
            continue;
        }
        spaces_needed = ROW_LEN - buf_len + nwords - 1;
        spaces_between_words = spaces_needed / (nwords - 1);
        memset((void*)spc, ' ', spaces_between_words);
        spc[spaces_between_words] = '\0';
        extra_spaces = spaces_needed % (nwords - 1);
        if ( extra_spaces )
            memset((void*)espc, ' ', extra_spaces);
        espc[extra_spaces] = '\0';
        for ( pWrd = strtok(buf, " "); pWrd != NULL; pWrd = strtok(NULL, " ") ){
            if ( --nwords ){
                if ( nwords == 1 && extra_spaces)
                    printf("%s%s%s", pWrd, spc, espc);
                else
                    printf("%s%s", pWrd, spc);
            }
            else
                printf("%s\n", pWrd);
        }
    }
    return 0;
Думаю попробывать это лучше ,но опять же по правому краю . А симвлов можно штук 20

Добавлено через 2 минуты
Да,вставлять пробелы после каждого символа. По правому краю экрана так же . Массивом решил попробывать ,не знаю даже . Можете помочь?

Добавлено через 8 минут
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
#include <stdio.h>
#include <string.h>
 
#define MAXSIZE 256
 
int main()
{
    char str[MAXSIZE], str1[MAXSIZE];
    int i,k=0;
    printf("Vvedite stroku: ");
    gets(str);
    for(i=0; i<strlen(str); i++)
    {
        if(str[i]=='a')
        {
            str1[k] = 'a';
            str1[k + 1]=' ';
            ++k;
        }
        else
            str1[k]=str[i];
           
 
           k++;
    }
    printf("\n");
    puts(str1);
    return 0;
}
При вводе текста любого мне выдает ошибку sh1 и пауза. Пробелы почему-то не вставляются
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4573 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
02.02.2021, 17:02
FAUST3561, зачем привели еще раз первоначальный код? Как он соотносится с предыдущим?
И что за ошибка sh1?
0
0 / 0 / 0
Регистрация: 08.05.2020
Сообщений: 10
09.02.2021, 17:01  [ТС]
Вот такое задание: Выравнивание правого края. Многие современные текстовые редакторы предоставляют пользователю возможность форматирования текст, когда правый край отпечатанного
текста выравнивается за счет увеличения промежутков между словами, встречающимися в строке.
Предлагается задача выбора подходящих промежутков. За счет изменения групп пробелов внутри строки надо добиться того, чтобы строка имела заданную длину,а пробелы в конце строки отсутствовали.
Напишите программу, которая в данном тексте, состоящем из нескольких строк, производила бы выравнивание правого края до заданной ширины.

Вроде всё сделал, вроде запускается, но результат выводит какой то белибердой. Помогите решить проблему с кодом, пожалуйста.


Код:

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
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
    vector<string> v;
    string sm;
    while (getline(cin, sm))
    {
        
            if (sm == "")//выход по пустой строке
                break;
            v.push_back(sm);
        
    }
    int *p=new int [v.size()]; // Количество пробелов в строке
    int max = 0;
    for (int i = 0; i<(int)v.size(); i++)
    {
        p[i] = 0;
        string s;
        for (int j = 0; j<(int)v[i].length(); j++)
        {
            if (v[i][j] != ' ')
            {
                s += v[i][j];
            }
            else if (v[i][j + 1] != ' ')
            {
                s += ' ';
                p[i]++;
            }
        }
        if (s[0] == ' ')
        {
            s.erase(0, 1);
            p[i]--;
        }
        if (s[s.length() - 1] == ' ')// Если в конце пробел, то число пробелов все равно нужно уменьшить, так как он не будет участвовать в выравнивании по ширине
        {
            if (strchr(",.!-?:"\'", s[s.length() - 2]) != NULL) s.erase(s.length() - 1, 1); // И если в конце стоит знак препинания, то пробел в конце не нужен
            p[i]--;
        }
        v[i] = s;   // Заменяем неотформатированный вариант отформатированным
 
        if (max < (int)v[i].length())
        {
            max = (int)v[i].length();
        }
    }
    for (int i = 0; i<(int)v.size(); i++)   // Затем второй проход строк 
    {
        int k = (int)v[i].length();  // Резервируем длину строки, так как она сейчас будет изменяться, а нам нужно при вычислениях учитывать исходные данные
        for (int j = 0; j<(int)v[i].length(); j++)
        {
            if (v[i][j] == ' ' && j + 1 != (int)v[i].length())
            {
                v[i].insert(j, (max - k) / p[i], ' ');   // Вставляем нужное количество пробелов между строк (так чтобы их было равное количество)
                j += (max - k) / p[i];  // Смещаем указатель проходящий все символы в строке
            }
        }
        v[i].insert(0, (max - k) % p[i], ' ');  // Оставшиеся пробелы вставляем в начало чтобы выровнять строку по правому краю
    }
    for (int i = 0; i<(int)v.size(); i++)
    {
        cout << v[i] << endl;
    }
    system("pause");
    return 0;
0
Just Do It!
 Аватар для XLAT
4198 / 2653 / 654
Регистрация: 23.09.2014
Сообщений: 8,947
Записей в блоге: 3
11.02.2021, 08:55
Лучший ответ Сообщение было отмечено FAUST3561 как решение

Решение

Цитата Сообщение от FAUST3561 Посмотреть сообщение
Выровнять текст по правому краю(вставка пробелов)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
///----------------------------------------------------------------------------|
/// C++17
/// Выравнивание текста по заданной ширине.
///----------------------------------------------------------------------------:
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
 
extern const char*          test1;
extern const char*          test2;
///------------------------------|
/// Конфиг.                      |
///------------------------------:
           size_t  WIDE   =    40;
       const char* test   = test2;
const std::string  BORD_R = "|"  ;
const std::string  BORD_L = "  |";
///------------------------------.
 
#define  l(v)  std::cout << #v << " = " << v << "\n\n";
 
typedef std::string                       S;
typedef std::vector<std::vector<S>> cargo_t;
 
S formate(std::string_view text)
{
    S       result;
    cargo_t cargo(1, std::vector<S>());
 
    auto insert_space  = [&cargo](const size_t NIL, size_t nib)
    {         auto& vs = cargo.back();
        const auto END = std::prev(vs.end());
 
        auto i = vs.begin();
        while(     nib-- ) *i++ += S(NIL+1,  ' ');
        while(i != END   ) *i++ += S(NIL  ,  ' ');
    };
 
    const S punc(" \n");
    size_t  w = 0;
 
    for(size_t i, e = 0;
            (i = text.find_first_not_of(punc, e)) != S::npos;)
    {   if( (e = text.find_first_of    (punc, i)) == S::npos )
             e = text.size();
 
        S s(text.substr(i, e - i));
 
        const size_t AS  = cargo.back().size()    ;
        const size_t AD  = cargo.back().size() - 1;
        if((w + s.size() + AS) > WIDE)
        {
            if(AS > 1)
            {   const std::div_t D = std::div(int(WIDE - w - AD), AD);
                insert_space(D.quot + 1, D.rem);
            }
 
            cargo.push_back(std::vector<S>(1, s));
            w = s.size();
        }
        else
        {   cargo .back().emplace_back(s);
            w += s.size();
        }
    }
 
    insert_space(1, 0);
 
    for(const auto& vs : cargo)
    {   w = 0;
        result += BORD_L;
        for(const auto& s : vs)
        {   result += s;
            w      += s.size();
        }
        if(WIDE >= w) result += S(WIDE - w, ' ') +  BORD_R + "\n";
        else          result += "\n";
    }
 
    return result;
}
 
///----------------------------------------------------------------------------|
/// Тест.
///----------------------------------------------------------------------------:
int main()
{   setlocale(0, "");
    const char* LN = "0_______10|_______20|_______30|_______40|_______50|_\n\n";
 
    l(WIDE)
    std::cout << BORD_L << LN << formate(test) << '\n';
 
      WIDE = 30;
    l(WIDE)
    std::cout << BORD_L << LN << formate(test);
 
    std::cin.get();
}
 
///----------------------------------------------------------------------------|
/// Тестовые строки.
///----------------------------------------------------------------------------:
const char* test1 = "12 345 5577 xxxyyyzz";
const char* test2 =
R"(Вот такое задание: Выравнивание правого края. Многие современные
   текстовые редакторы предоставляют пользователю возможность форматирования
   текст, когда правый край отпечатанного
текста выравнивается за счет увеличения промежутков между словами,
встречающимися в строке.
Предлагается задача выбора подходящих промежутков. За счет изменения групп
пробелов внутри строки надо добиться того, чтобы строка имела заданную длину,
а пробелы в конце строки отсутствовали.
Напишите программу, которая в данном тексте, состоящем из нескольких строк,
производила бы выравнивание правого края до заданной ширины.
 
Вроде всё сделал, вроде запускается, но результат выводит какой то белибердой.
Помогите решить проблему с кодом, пожалуйста.)";
Входная строка:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const char* test2 =
R"(Вот такое задание: Выравнивание правого края. Многие современные
   текстовые редакторы предоставляют пользователю возможность форматирования
   текст, когда правый край отпечатанного
текста выравнивается за счет увеличения промежутков между словами,
встречающимися в строке.
Предлагается задача выбора подходящих промежутков. За счет изменения групп
пробелов внутри строки надо добиться того, чтобы строка имела заданную длину,
а пробелы в конце строки отсутствовали.
Напишите программу, которая в данном тексте, состоящем из нескольких строк,
производила бы выравнивание правого края до заданной ширины.
 
Вроде всё сделал, вроде запускается, но результат выводит какой то белибердой.
Помогите решить проблему с кодом, пожалуйста.)";
Результат:
1
0 / 0 / 0
Регистрация: 08.05.2020
Сообщений: 10
16.02.2021, 16:30  [ТС]
А вы не знаете как эту программу сломать с точки зрения тестера ?) У меня просто такое задание
0
Just Do It!
 Аватар для XLAT
4198 / 2653 / 654
Регистрация: 23.09.2014
Сообщений: 8,947
Записей в блоге: 3
17.02.2021, 08:55
Цитата Сообщение от FAUST3561 Посмотреть сообщение
А вы не знаете как эту программу сломать с точки зрения тестера ?
C++
1
2
3
4
5
///----------------------------------------------------------------------------|
/// Тестовые строки.
///----------------------------------------------------------------------------:
WIDE = 30;
const char* test1 = "очень_длинное_слово_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.02.2021, 08:55
Помогаю со студенческими работами здесь

Выравнивание строк в файле по правому краю
Текстовый файл, состоящий из N строк разной длины, выровнять по правому краю по введённой с клавиатуры длине строки. С файлам совсем...

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

Выравнивание строки по правому краю до заданной длины
выравнивание строки s по правому краю до длины l. Задание нужно сделать с помощью адресной арифметики. 3 день не могу сделать. Подскажите...

Дан файл с абзацем, выровненым по левому краю, надо отформатировать по правому краю
есть задание дан файл с абзацем выровненым по левому краю , надо отформатировать по правому краю!!

Label - выравнивание по правому краю
Привет появился вопрос про label 1)у меня есть текст к примеру в label холодильник - 1234567 мне нужно что бы к примеру при нажатии на...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru