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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.96
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
#1

Вставка в строку другой строки, начиная с заданной позиции - C++

26.06.2010, 00:12. Просмотров 3539. Ответов 14
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class String
{
protected:
    char*str;//Указатель на массив символов
    int size;//Длина строки
    int num;//Кол-во символов в строке
//
};
class BufferedString:public String
{//};
 
void BufferedString::add_str()
{
    char s[100];
    int n=0;
    std::cout<<"Enter string\n";std::cin.getline(s,sizeof(s));
    std::cout<<"Enter number of position\n";std::cin>>n;
Далее не могу врубиться как делать. Подскажите плз?
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2010, 00:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вставка в строку другой строки, начиная с заданной позиции (C++):

Разработать функцию,которая перекрывает символы строки заданным количеством символов другой строки, начиная с заданной позиции - C++
Разработать функцию,которая перекрывает символы строки заданным количеством символов другой строки, начиная с заданной позиции.При...

Удалить из строки заданное количество символов, начиная с заданной позиции. Преобразовать строку таким образом - C++
Удалить из строки заданное количество символов, начиная с заданной позиции. Преобразовать строку таким образом, чтобы сначала в ней были...

Реализовать вставку подстроки в строку, начиная с заданной пользователем позиции - C++
Доброго времени суток. Отстала по теме строки. Сижу читаю в инернете, но пока не удается написать полную программу. Помогите, пожалуйста,...

Вставка подстроки в строку с заданной позиции - C++
Помогите, пожалуйста, расписать функцию insert (); #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { ...

Удалить из строки заданное количество символов, начиная с заданной позиции - C++
8.6.1. Помогите, пожалуйста, решить задачи в С++. Написать программу удаления из строки заданного количества символов, начиная с...

Функция удаляет из строки заданное количество символов, начиная с заданной позиции - C++
Подскажите, что не так в программе.? Функция удаляет из строки заданное количество символов, начиная с заданной позиции. (При...

14
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
26.06.2010, 02:11 #2
Как-то так:
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
#include <iostream>
#include <cstring>
 
class String {
    char * m_pBuf;
    int m_strLen;
public:
    String() : m_strLen(0) {
        m_pBuf = new char [ 1 ];
        *m_pBuf = 0;
    }
    String(const char * pCStr ){
        m_strLen = strlen(pCStr);
        m_pBuf = new char [ m_strLen + 1 ];
        strcpy(m_pBuf, pCStr);
    }
    String(const String & s){
        *this = s;
    }
    ~String(){
        if ( m_pBuf )
            delete [] m_pBuf;
    }
    const String & operator = (const String & s){
        if ( this != &s ){
            if ( m_pBuf )
                delete [] m_pBuf;
            m_strLen = s.m_strLen;
            m_pBuf = new char [ m_strLen + 1 ];
            strcpy(m_pBuf, s.m_pBuf);
        }
        return *this;
    }
    bool insertAt(int pos, const String & s){
        if ( pos < 0 || pos > m_strLen - 1 || s.m_strLen == 0 )
            return false;
        char * tmpBuf = new char [ m_strLen + s.m_strLen + 1 ];
        if ( pos ){
            memcpy(tmpBuf, m_pBuf, pos);
            memcpy(tmpBuf + pos, s.m_pBuf, s.m_strLen);
            if ( pos < m_strLen - 1 )
                memcpy(tmpBuf + pos + s.m_strLen, m_pBuf + pos, m_strLen - pos);
        }
        else {
            memcpy(tmpBuf, s.m_pBuf, s.m_strLen);
            memcpy(tmpBuf + s.m_strLen, m_pBuf, m_strLen);
        }
        m_strLen += s.m_strLen;
        tmpBuf[m_strLen] = 0;
        delete [] m_pBuf;
        m_pBuf = tmpBuf;
        return true;
    }
    int len() const { return m_strLen; }
    friend std::ostream & operator << (std::ostream & ost, const String & s){
        ost << s.m_pBuf;
        return ost;
    }
};
 
int main(){
    String a("abcdefgh");
    String b("zzz");
    std::cout << "A:  " << a << std::endl;
    std::cout << "B:  " << b << std::endl;
    std::cout << "Inserting B at middle of A..." << std::endl;
    a.insertAt(a.len() / 2, b);
    std::cout << "AB: " << a << std::endl;
    return 0;
}
2
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.06.2010, 02:25  [ТС] #3
easybudda, Мама мия... Спасибо... Лучше пока забью на это задание оО
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
26.06.2010, 02:29 #4
Lavroff, а я вот его как-раз поправил немного, а то не всё как надо работало...
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
#include <iostream>
#include <cstring>
 
class String {
    char * m_pBuf;
    int m_strLen;
public:
    String() : m_strLen(0) {
        m_pBuf = new char [ 1 ];
        *m_pBuf = 0;
    }
    String(const char * pCStr ){
        m_strLen = strlen(pCStr);
        m_pBuf = new char [ m_strLen + 1 ];
        strcpy(m_pBuf, pCStr);
    }
    String(const String & s){
        *this = s;
    }
    ~String(){
        if ( m_pBuf )
            delete [] m_pBuf;
    }
    const String & operator = (const String & s){
        if ( this != &s ){
            if ( m_pBuf )
                delete [] m_pBuf;
            m_strLen = s.m_strLen;
            m_pBuf = new char [ m_strLen + 1 ];
            strcpy(m_pBuf, s.m_pBuf);
        }
        return *this;
    }
    bool insertAt(int pos, const String & s){
        if ( pos < 0 || pos > m_strLen || s.m_strLen == 0 )
            return false;
        char * tmpBuf = new char [ m_strLen + s.m_strLen + 1 ];
        if ( pos ){
            memcpy(tmpBuf, m_pBuf, pos);
            memcpy(tmpBuf + pos, s.m_pBuf, s.m_strLen);
            if ( pos < m_strLen )
                memcpy(tmpBuf + pos + s.m_strLen, m_pBuf + pos, m_strLen - pos);
        }
        else {
            memcpy(tmpBuf, s.m_pBuf, s.m_strLen);
            memcpy(tmpBuf + s.m_strLen, m_pBuf, m_strLen);
        }
        m_strLen += s.m_strLen;
        tmpBuf[m_strLen] = 0;
        delete [] m_pBuf;
        m_pBuf = tmpBuf;
        return true;
    }
    int len() const { return m_strLen; }
    friend std::ostream & operator << (std::ostream & ost, const String & s){
        ost << s.m_pBuf;
        return ost;
    }
};
 
int main(){
    String a("abcdefgh");
    String b("zzz");
    std::cout << "A:  " << a << std::endl;
    std::cout << "B:  " << b << std::endl;
    std::cout << "Inserting B at middle of A..." << std::endl;
    a.insertAt(a.len() / 2, b);
    std::cout << "AB: " << a << std::endl;
    String c;
    c = a;
    std::cout << "Copy of A: " << c << std::endl;
    std::cout << "Adding B to begin of C..." << std::endl;
    c.insertAt(0, b);
    std::cout << "C:  " << c << std::endl;
    std::cout << "Adding B to end of C..." << std::endl;
    c.insertAt(c.len(), b);
    std::cout << "C:  " << c << std::endl;
    return 0;
}
и примеров добавил...
2
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.06.2010, 02:33  [ТС] #5
easybudda, Большое спасибо! Как по вашему, через чар это переделать будет не особо сложно?
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
26.06.2010, 02:45 #6
Цитата Сообщение от Lavroff Посмотреть сообщение
через чар это переделать будет не особо сложно?
Не понял вопрос. У меня и так по сути строка - это массив char...
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.06.2010, 02:49  [ТС] #7
Цитата Сообщение от easybudda Посмотреть сообщение
Не понял вопрос. У меня и так по сути строка - это массив char...
Оу да) Сглупил)

П.С. А такая функция как делается? Удаление из строки заданного колличества символов, начиная с заданной позиции? Можно как я понял и не удаление, а просто вставка '0' на эти места...
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
26.06.2010, 02:54 #8
Нэа. Надо же слепить символы которые справа и слева от удаленных.

Добавлено через 1 минуту
Если была строка s = "blablabla", позаменяв в середине символы на нули - s = "bla\0\0\0bla" получишь строку, которую любые функции будут воспринимать как просто "bla", т.к. '\0' считается окончанием строки.
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.06.2010, 03:03  [ТС] #9
Цитата Сообщение от Хохол Посмотреть сообщение
Нэа. Надо же слепить символы которые справа и слева от удаленных.

Добавлено через 1 минуту
Если была строка s = "blablabla", позаменяв в середине символы на нули - s = "bla\0\0\0bla" получишь строку, которую любые функции будут воспринимать как просто "bla", т.к. '\0' считается окончанием строки.
Я писал не '\0' заметьте, а просто '0'.
0
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
26.06.2010, 03:06 #10
Извиняюсь. Но какое ж это тогда удаление будет?
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.06.2010, 03:14  [ТС] #11
Цитата Сообщение от Хохол Посмотреть сообщение
Извиняюсь. Но какое ж это тогда удаление будет?
Не будет удаления. Учебник не надо слушаться полностью. Хотя про функцию удаления тоже было бы интересно услышать
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
26.06.2010, 04:04 #12
Цитата Сообщение от Lavroff Посмотреть сообщение
Хотя про функцию удаления тоже было бы интересно услышать
добавьте в класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
    bool erase(int pos, int cnt){
        if ( pos < 0 || pos > m_strLen - 1 || cnt < 1 )
            return false;
        char * tmpBuf;
        if ( cnt > m_strLen - pos )
            cnt = m_strLen - pos;
        tmpBuf = new char [ m_strLen - cnt + 1 ];
        if ( pos )
            memcpy(tmpBuf, m_pBuf, pos);
        if ( pos + cnt < m_strLen )
            memcpy(tmpBuf + pos, m_pBuf + pos + cnt, m_strLen - pos - cnt);
        m_strLen -= cnt;
        tmpBuf[m_strLen] = 0;
        delete [] m_pBuf;
        m_pBuf = tmpBuf;
        return true;
    }
...
а к проверкам добавьте
C++
1
2
3
4
5
6
7
8
9
10
11
...
    std::cout << "Erase 3 first..." << std::endl;
    c.erase(0, 3);
    std::cout << "C:  " << c << std::endl;
    std::cout << "Erase 3 last..." << std::endl;
    c.erase(c.len() - 3, 3);
    std::cout << "C:  " << c << std::endl;
    std::cout << "Erase 3 middle..." << std::endl;
    c.erase(4, 3);
    std::cout << "C:  " << c << std::endl;
...
1
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
26.06.2010, 04:14  [ТС] #13
easybudda, Спасибо! Завтра займусь
0
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
09.06.2011, 02:30 #14
Прошу прощенья, easybudda, а у меня у одного находит 21 ошибку в данном коде (последнем).
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
09.06.2011, 09:23 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от x-positive Посмотреть сообщение
Прошу прощенья, easybudda, а у меня у одного находит 21 ошибку в данном коде (последнем).
В "последнем" всего 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
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
#include <iostream>
#include <cstring>
 
class String {
        char * m_pBuf;
        int m_strLen;
public:
        String() : m_strLen(0) {
                m_pBuf = new char [ 1 ];
                *m_pBuf = 0;
        }
        String(const char * pCStr ){
                m_strLen = strlen(pCStr);
                m_pBuf = new char [ m_strLen + 1 ];
                strcpy(m_pBuf, pCStr);
        }
        String(const String & s){
                *this = s;
        }
        ~String(){
                if ( m_pBuf )
                        delete [] m_pBuf;
        }
        const String & operator = (const String & s){
                if ( this != &s ){
                        if ( m_pBuf )
                                delete [] m_pBuf;
                        m_strLen = s.m_strLen;
                        m_pBuf = new char [ m_strLen + 1 ];
                        strcpy(m_pBuf, s.m_pBuf);
                }
                return *this;
        }
        bool insertAt(int pos, const String & s){
                if ( pos < 0 || pos > m_strLen || s.m_strLen == 0 )
                        return false;
                char * tmpBuf = new char [ m_strLen + s.m_strLen + 1 ];
                if ( pos ){
                        memcpy(tmpBuf, m_pBuf, pos);
                        memcpy(tmpBuf + pos, s.m_pBuf, s.m_strLen);
                        if ( pos < m_strLen )
                                memcpy(tmpBuf + pos + s.m_strLen, m_pBuf + pos, m_strLen - pos);
                }
                else {
                        memcpy(tmpBuf, s.m_pBuf, s.m_strLen);
                        memcpy(tmpBuf + s.m_strLen, m_pBuf, m_strLen);
                }
                m_strLen += s.m_strLen;
                tmpBuf[m_strLen] = 0;
                delete [] m_pBuf;
                m_pBuf = tmpBuf;
                return true;
        }
        bool erase(int pos, int cnt){
                if ( pos < 0 || pos > m_strLen - 1 || cnt < 1 )
                        return false;
                char * tmpBuf;
                if ( cnt > m_strLen - pos )
                        cnt = m_strLen - pos;
                tmpBuf = new char [ m_strLen - cnt + 1 ];
                if ( pos )
                        memcpy(tmpBuf, m_pBuf, pos);
                if ( pos + cnt < m_strLen )
                        memcpy(tmpBuf + pos, m_pBuf + pos + cnt, m_strLen - pos - cnt);
                m_strLen -= cnt;
                tmpBuf[m_strLen] = 0;
                delete [] m_pBuf;
                m_pBuf = tmpBuf;
                return true;
        }
        int len() const { return m_strLen; }
        friend std::ostream & operator << (std::ostream & ost, const String & s){
                ost << s.m_pBuf;
                return ost;
        }
};
 
int main(){
        String a("abcdefgh");
        String b("zzz");
        std::cout << "A:  " << a << std::endl;
        std::cout << "B:  " << b << std::endl;
        std::cout << "Inserting B at middle of A..." << std::endl;
        a.insertAt(a.len() / 2, b);
        std::cout << "AB: " << a << std::endl;
        String c;
        c = a;
        std::cout << "Copy of A: " << c << std::endl;
        std::cout << "Adding B to begin of C..." << std::endl;
        c.insertAt(0, b);
        std::cout << "C:  " << c << std::endl;
        std::cout << "Adding B to end of C..." << std::endl;
        c.insertAt(c.len(), b);
        std::cout << "C:  " << c << std::endl;
        std::cout << "Erase 3 first..." << std::endl;
        c.erase(0, 3);
        std::cout << "C:  " << c << std::endl;
        std::cout << "Erase 3 last..." << std::endl;
        c.erase(c.len() - 3, 3);
        std::cout << "C:  " << c << std::endl;
        std::cout << "Erase 3 middle..." << std::endl;
        c.erase(4, 3);
        std::cout << "C:  " << c << std::endl;
        return 0;
}
Вставка в строку другой строки, начиная с заданной позиции

Не по теме:

Знатный покойник, год пролежал...

0
09.06.2011, 09:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2011, 09:23
Привет! Вот еще темы с ответами:

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

Как в файле удалить n байт, начиная с заданной позиции - C++
Вопрос: как в файле удалить n байт начиная с заданной позиции? (файловый ввод-вывод в стиле C++)

Вставить подстроку в строку, начиная с позиции n - C++
Надо вставить подстроку в строку, начиная с позиции n.

Вставить в строку s содержимое s1 начиная с позиции n - C++
Помогите пожалуйста написать программу! Вставить в строку s содержимое s1 начиная с позиции n. То есть сначала идут n-первых символов s,...


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

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

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