Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 17
1

Выборочный переворот строки

16.04.2018, 15:48. Просмотров 992. Ответов 11
Метки нет (Все метки)

Доброго дня!
Хочу написать программу, которая на входных данных получает строку, в которой фраза с обычным порядком букв, но в квадратных скобках фрагменты, которые нужно перевернуть.
Например:
Входные данные: My n[ema] is [evs]ta
Выходные данные: My name is sveta

В задумке эта программа должна была выводить посимвольно строку, пока не встретит "[", с этого момента все символы после "[" записываются в массив buf, пока не встретится "]". Потом buf переворачивается функцией revers и выводится. Но до этого еще не дошла, а зашла в тупик, потому что в buf записывается какая-то нехорошая вещь.. Результат работы программы во вложении.
ПОМОГИТЕ ПОЖАЛУЙСТА

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
#include "stdafx.h"
#include <string.h>
#include <string>
#include <iostream>
 
 
using namespace std;
 
 
 
char* revers(char* str)
{
    int i = 0;
    while (str[i]) i++; //считаем длину строки
    for (int j = 0; j < i / 2; j++)
    {
        swap(str[j], str[i - j - 1]);
    }
    return str;
}
int main()
{   
    char str[256];
    cin >> str;
    
    char buf[20];
    int j = 0;
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] != '[')
            cout << str[i];
        else if (str[i] == '[') 
        while(str[i+1]!=']')
        {
            buf[j] = str[i + 1];
            j++; i++;
        }
            
                
    }cout <<endl<< "buf is    " << buf<<endl;
    
    cout << endl;
    system("pause");
    return 0;
}[ATTACH]929270[/ATTACH]
0
Миниатюры
Выборочный переворот строки  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2018, 15:48
Ответы с готовыми решениями:

Переворот строки
Реализуйте класс ReversibleString, хранящий строку и поддерживающий методы Reverse для переворота...

Переворот строки
Ребят,у меня есть 2 часа чтоб понять!УМОЛЯЮ, помогите...объясните в этой функции( которая...

Переворот строки
Добрый вечер. Нужно перевернуть строку 12345 в 54321. Подскажите, где неверно в коде. Если можно...

Переворот строки
Почему при использовании указателя ошибка, а при использование массива всё нормально? void...

11
186 / 174 / 111
Регистрация: 22.06.2009
Сообщений: 533
16.04.2018, 16:14 2
Лучший ответ Сообщение было отмечено maslenkovas как решение

Решение

maslenkovas, *buf выходит за пределы, что бы его тормазнуть нужно передать в конец букв 0
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
#include <cstring>
#include <iostream>
 
using namespace std;
 
 
 
char* revers(char* str) {
    int i = 0;
    while (str[i]) i++; //считаем длину строки
    for (int j = 0; j < i / 2; j++)
    {
        swap(str[j], str[i - j - 1]);
    }
    return str;
}
int main() {   
    char str[256];
    cin >> str;
    
    char buf[20];
    int j = 0;
    for (int i = 0; i < strlen(str); i++)
    {
        if (str[i] == ']') {
            continue;
        } else if (str[i] != '[') {
            cout << str[i];
        } else {
            while(str[i+1]!=']')
            {
                buf[j] = str[i + 1];
                j++; i++;
                
            }
            
        }   
                
    }
    buf[j] = '\0';
    cout << endl << "buf is " <<  buf << endl;
    
    cout << endl;
    system("pause");
    return 0;
}
1
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
16.04.2018, 16:19 3
Цитата Сообщение от maslenkovas Посмотреть сообщение
cin >> str;
У тебя в данном месте будет считывать до пробела.

Добавлено через 26 секунд
лучше писать
C++
1
cin.getline(str,256);
1
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 17
16.04.2018, 16:58  [ТС] 4
А как сделать, чтобы теперь buf выводился куда мне нужно?. вроде в else вывод его нужно писать, но там он выводит какую-то гадость опять, даже если перед этим buf[j] = '\0'; ставлю..

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
#include "stdafx.h"
#include <string.h>
#include <string>
#include <iostream>
#include <cstring>
 
 
using namespace std;
 
 
 
char* revers(char* str)
{
    int i = 0;
    while (str[i]) i++; //считаем длину строки
    for (int j = 0; j < i / 2; j++)
    {
        swap(str[j], str[i - j - 1]);
    }
    return str;
}
int main()
{
    char str[256];
    cin >> str;
 
    char buf[20];
    int j = 0;
    for (int i = 0; i < strlen(str); i++)
    {
        
        if (str[i] == ']') {
            continue;
        }
        else if (str[i] != '[') {
            cout << str[i];
        }
        else {
            while (str[i + 1] != ']')
            {
                buf[j] = str[i + 1];
                j++; i++;
 
            } 
 
        } buf[j] = '\0'; cout << buf;
 
    }
    
    buf[j] = '\0';
    cout << endl << "buf is " << buf << endl;
 
    cout << endl;
    system("pause");
    return 0;
}
0
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
16.04.2018, 17:04 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
#include <string.h>
#include <string>
#include <iostream>
 
 
using namespace std;
 
 
 
char* revers(char* str)
{
    int i = 0;
    while (str[i]) i++; //считаем длину строки
    for (int j = 0; j < i / 2; j++)
    {
        swap(str[j], str[i - j - 1]);
    }
    return str;
}
int main()
{
    char str[256];
    cin.getline(str, 256);
    char buf[20];
    int j = 0;
    int z;
    for (int i = 0; i < strlen(str); i++) {
        z = 1;
        if (str[i] == '[') {
            i++;
            z = 0;
            while (str[i] != ']') {
                buf[j] = str[i];
                i++;
                z++;
                j++;
            }
        }
        i += z - 1;
    }
    for (int i = 0; i < j; i++) {
        cout << buf[i];
    }
    cout << endl;
    system("pause");
    return 0;
}
Вот как сделал я. Без реверса. Я просто записал всё в скобках в buf.

Добавлено через 43 секунды
Без нулевого элемента. Я просто создал отдельную переменную, чтобы считать размер
0
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 17
16.04.2018, 17:14  [ТС] 6
А он же просто buf тогда выводит, а мне же нужно, чтобы всю строку, до скобок, что в скобках и что после. Просто я потом что в скобках переверну. Или я не так поняла?
0
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
16.04.2018, 17:25 7
Лучший ответ Сообщение было отмечено maslenkovas как решение

Решение

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
#include <string.h>
#include <string>
#include <iostream>
 
 
using namespace std;
 
 
 
char* revers(char* str, int n)
{
    int i = 0;
    for (int j = 0; j < n / 2; j++)
    {
        swap(str[j], str[n - j - 1]);
    }
    return str;
}
int main()
{
    char str[256];
    cin.getline(str, 256);
    char buf[20];
    int j;
    int z;
    for (int i = 0; i < strlen(str); i++) {
        z = 1;
        if (str[i] == '[') {
            i++;
            z = 0;
            j = 0;
            while (str[i] != ']') {
                buf[j] = str[i];
                i++;
                z++;
                j++;
            }
            revers(buf,j);
            i = i - j;
            for (int k = 0; k < j; k++) {
                str[i] = buf[k];
                i++;
            }
        }
        i += z - 1;
    }
    for (int i = 0; i < strlen(str); i++) {
        cout << str[i];
    }
    cout << endl;
    system("pause");
    return 0;
}
это если оставить со скобками, если нужно без скобок, то это писать отдельную функцию на удаление скобок
1
0 / 0 / 0
Регистрация: 11.01.2017
Сообщений: 17
16.04.2018, 18:24  [ТС] 8
Спасибо!
Переворачивается выражение только в первых скобках, а во вторых и последующих уже нет..
Может как-то можно обнулить buf и его заново заполнять, когда встречаются скобки?
0
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
16.04.2018, 18:27 9
Цитата Сообщение от maslenkovas Посмотреть сообщение
Переворачивается выражение только в первых скобках, а во вторых и последующих уже нет..
У меня переворачивается.
1
Изображения
 
11 / 11 / 10
Регистрация: 26.12.2017
Сообщений: 48
16.04.2018, 18:35 10
Цитата Сообщение от maslenkovas Посмотреть сообщение
Может как-то можно обнулить buf и его заново заполнять, когда встречаются скобки?
В моём коде перезаписывается buf. То есть, в нём идет по строке. Видит скобки. Сохраняет внутренности в buf. Реверс. Потом записывает его обратно в строку. И так снова.
1
1460 / 926 / 807
Регистрация: 30.04.2016
Сообщений: 3,197
08.05.2018, 23:52 11
maslenkovas, здравствуйте! Пока пройтись по строке и перевернуть все внутри не удалось и я набросал грубый, но рабочий вариант. Обязательно вернусь к этой теме с более элегантным решением. Вот код:

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
#include <bits/stdc++.h>
 
    using namespace std;
 
int main() {
    int x, y;
    string str = "My n[ema] is [evs]ta";
    vector<pair<int, int>> vec(100);
    x = y = 0;
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == '[')
            vec[x++].first = i;
        if (str[i] == ']')
            vec[y++].second = i - 1;
    }
    vec.resize(x);
    for (int i = vec.size() - 1; i >= 0; i--) {
        vec[i].first++;
        vec[i].second++;
        reverse(str.begin() + vec[i].first, str.end() - (str.size() - vec[i].second));
        str.erase(vec[i].first - 1, 1);
        str.erase(vec[i].second - 1, 1);
    }
    cout << str << "\n";
    system("pause");
    return 0;
}
0
1460 / 926 / 807
Регистрация: 30.04.2016
Сообщений: 3,197
13.05.2018, 15:53 12
Цитата Сообщение от maslenkovas Посмотреть сообщение
В задумке эта программа должна была выводить посимвольно строку, пока не встретит "[", с этого момента все символы после "[" записываются в массив buf, пока не встретится "]". Потом buf переворачивается функцией revers и выводится. Но до этого еще не дошла, а зашла в тупик, потому что в buf записывается какая-то нехорошая вещь..
Здравствуйте! У меня была такая же задумка, когда я увидел условие вашей задачи. Не сразу получилось все сделать самому (мой код в посте #11), но в итоге программа была написана. Вот код:

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
#include <bits/stdc++.h>
 
    using namespace std;
 
int main() {
    string str = "My n[ema] is [evs]ta";
    string s, tmp;
    bool flag = false;
    for (int i = 0; i < str.size(); i++) {
        if (str[i] == '[') {
            flag = true;
        } else {
            if (str[i] == ']') {
                s += tmp;
                tmp = "";
                flag = false;
            } else {
                if (flag) tmp = str[i] + tmp;
                else s += str[i];
            }
        }
    }
    cout << s << "\n";
    system("pause");
    return 0;
}
P.S. На мой взгляд, получилась не очень сложная для понимания реализация. Надеюсь, вы во всем разберетесь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2018, 15:53

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Переворот строки рекурсией
Всем привет! В книге Герберта Шилдта &quot;C++ Шаг за шагом&quot; глава: Рекурсии есть такой пример: ...

Переворот строки. Необработанное исключение. Нарушения прав доступа
void turn(char c, int step, int size) { if(step &lt; size&gt;&gt;1) { char temp = c; ...

Переворот строки, не используя временные переменные и не осуществляя полного прохода по всей строке
У вас есть переменная std::string str = &quot;abcdefghijklmop&quot;;Напишите код переворота строки, не...

Переворот строки
Нужно написать рекурсивную подпрограмму переворота строки. Например: прога-&gt;агорп


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

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

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