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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.96
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.06.2010, 00:12     Вставка в строку другой строки, начиная с заданной позиции #1
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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2010, 00:12     Вставка в строку другой строки, начиная с заданной позиции
Посмотрите здесь:

C++ Разработать функцию,которая перекрывает символы строки заданным количеством символов другой строки, начиная с заданной позиции
C++ Вставить в строку s содержимое s1 начиная с позиции n
Установка L символов строки s в значение t, начиная с позиции n C++
C++ как в файле удалить n байт, начиная с заданной позиции
C++ Функция удаляет из строки заданное количество символов, начиная с заданной позиции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.06.2010, 02:25  [ТС]     Вставка в строку другой строки, начиная с заданной позиции #3
easybudda, Мама мия... Спасибо... Лучше пока забью на это задание оО
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
и примеров добавил...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.06.2010, 02:33  [ТС]     Вставка в строку другой строки, начиная с заданной позиции #5
easybudda, Большое спасибо! Как по вашему, через чар это переделать будет не особо сложно?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.06.2010, 02:45     Вставка в строку другой строки, начиная с заданной позиции #6
Цитата Сообщение от Lavroff Посмотреть сообщение
через чар это переделать будет не особо сложно?
Не понял вопрос. У меня и так по сути строка - это массив char...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.06.2010, 02:49  [ТС]     Вставка в строку другой строки, начиная с заданной позиции #7
Цитата Сообщение от easybudda Посмотреть сообщение
Не понял вопрос. У меня и так по сути строка - это массив char...
Оу да) Сглупил)

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

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

Добавлено через 1 минуту
Если была строка s = "blablabla", позаменяв в середине символы на нули - s = "bla\0\0\0bla" получишь строку, которую любые функции будут воспринимать как просто "bla", т.к. '\0' считается окончанием строки.
Я писал не '\0' заметьте, а просто '0'.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
26.06.2010, 03:06     Вставка в строку другой строки, начиная с заданной позиции #10
Извиняюсь. Но какое ж это тогда удаление будет?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.06.2010, 03:14  [ТС]     Вставка в строку другой строки, начиная с заданной позиции #11
Цитата Сообщение от Хохол Посмотреть сообщение
Извиняюсь. Но какое ж это тогда удаление будет?
Не будет удаления. Учебник не надо слушаться полностью. Хотя про функцию удаления тоже было бы интересно услышать
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
26.06.2010, 04:14  [ТС]     Вставка в строку другой строки, начиная с заданной позиции #13
easybudda, Спасибо! Завтра займусь
x-positive
1 / 1 / 0
Регистрация: 09.02.2011
Сообщений: 21
09.06.2011, 02:30     Вставка в строку другой строки, начиная с заданной позиции #14
Прошу прощенья, easybudda, а у меня у одного находит 21 ошибку в данном коде (последнем).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2011, 09:23     Вставка в строку другой строки, начиная с заданной позиции
Еще ссылки по теме:

Скопировать из одного символьного массива в другой, начиная с определенной позиции C++
C++ Удалить из строки заданное количество символов, начиная с заданной позиции
Вставка подстроки в строку с заданной позиции C++

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

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
Вставка в строку другой строки, начиная с заданной позиции

Не по теме:

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

Yandex
Объявления
09.06.2011, 09:23     Вставка в строку другой строки, начиная с заданной позиции
Ответ Создать тему
Опции темы

Текущее время: 21:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru