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

Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку - C++

Восстановить пароль Регистрация
 
Xsenon_rus
8 / 8 / 0
Регистрация: 18.04.2011
Сообщений: 104
23.04.2013, 12:00     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку #1
Здравствуйте, у меня проблема вот в чем не знаю как написать функцию :

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

Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку;

Но при этом нельзя пользоваться string.

Не могли бы вы помочь помочь ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2013, 12:00     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку
Посмотрите здесь:

Определить, является ли палиндромом часть строки s, начиная с i-го символа и заканчивая j-ым (рекурсия) C++
C++ Для каждого Ai, начиная с последнего и заканчивая первым, вывести его квадратный корень не менее чем с четырьмя знаками после запятой
В тексте после указанного символа вставить подстроку C++
Если встречается нечетный элемент, то перед ним и после него вставить новые элементы со значением 0 C++
C++ Вставить новый символ после заданного
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
23.04.2013, 12:26     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку #2
Цитата Сообщение от Xsenon_rus Посмотреть сообщение
не знаю как написать функцию
Только функцию? Т.е. сам контейнер строк у вас уже есть? Покажите.

Добавлено через 23 секунды
Цитата Сообщение от Xsenon_rus Посмотреть сообщение
Вставить в последовательность строк, начиная (заканчивая) с текущей
Вставить, начиная с текущей... Что-то я не понимаю, как это.
Tulosba
:)
Эксперт C++
4377 / 3220 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.04.2013, 12:40     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Т.е. сам контейнер строк у вас уже есть? Покажите.
Думается, это обычный char[].
Цитата Сообщение от lemegeton Посмотреть сообщение
Вставить, начиная с текущей...
Вероятно проигнорировать первые несколько строк нужно.
Xsenon_rus
8 / 8 / 0
Регистрация: 18.04.2011
Сообщений: 104
24.04.2013, 01:45  [ТС]     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку #4
Цитата Сообщение от lemegeton Посмотреть сообщение
Только функцию? Т.е. сам контейнер строк у вас уже есть? Покажите.

Добавлено через 23 секунды

Вставить, начиная с текущей... Что-то я не понимаю, как это.
1) Это просто чаровский массив
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Text::input()
{   
    for (int i = 0;(i < 256); i++)
    {
        cin.getline(m_strings[i], 256, '\n');
        m_size = i;
        if (m_strings[i][0]=='~')
            break;
    }
 
    m_position = m_size;
 
    cout << "Current position: " << m_position << endl;
}
2)Это вставка перед или после заданной строки с заданным номером.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Вероятно проигнорировать первые несколько строк нужно.
Да нужно сделать как бы сдвиг всего массива и вставить то что нужно. Только вот как ...?
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
24.04.2013, 10:24     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку #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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <cstring>
#include <iostream>
 
class Text {
 public:
  typedef char **Line;
  typedef char *const *ConstLine;
  
  Text() : size(0), capacity(2), text(new char*[capacity]) {}
  Text(const Text &other) : size(0), capacity(2),
    text(new char*[capacity]) {
    insert(begin(), other.begin(), other.end());
  }
  Text &operator=(const Text &other) {
    if (this != &other) {
      clear();
      insert(begin(), other.begin(), other.end());
    }
    return *this;
  }
  virtual ~Text() {
    clear();
    delete [] text;
  }
 
  void clear() {
    for (size_t i = 0; i < size; ++i) {
      delete [] text[i];
    }
    size = 0;
  }
  size_t getSize() const { return size; }
  size_t getCapacity() const { return capacity; }
  size_t getMaximumCapacity() const { return -1; }
 
  ConstLine insert(ConstLine position, const char *string) {
    size_t n = position - begin();
    assureCapacity();
    Line newLine = begin() + n;
    for (Line i = text + size; i != newLine; --i) {
      *i = *(i - 1);
    }
    *newLine = strcpy(new char[strlen(string) + 1], string);
    ++size;
    return newLine;
  }
  void insert(ConstLine position, ConstLine first, ConstLine last) {
    while (first != last) {
      position = insert(position, *first) + 1;
    }
  }
  void erase(ConstLine position) {
    for (Line i = text + (position - begin()); i != end() - 1; ++i) {
      *i = *(i + 1);
    }
    --size;
  }
 
  Line begin() { return text; }
  ConstLine begin() const { return text; }
  Line end() { return text + size; }
  ConstLine end() const { return text + size; }
 private:
  void assureCapacity() {
    if (size >= capacity - 1) {
      capacity += 1;
      char **newText = new char*[capacity];
      for (size_t i = 0; i < size; ++i) {
        newText[i] = text[i];
      }
      delete [] text;
      text = newText;
    }
  }
  size_t size;
  size_t capacity;
  char **text;
};
 
int main(int argc, char *argv[]) {
  Text text;
  // добавление строк в конец
  text.insert(text.end(), "To be, or not to be: that is the question:");
  text.insert(text.end(), "The slings and arrows of outrageous fortune,");
  text.insert(text.end(), "Or to take arms against a sea of troubles,");
  text.insert(text.end(), "And by opposing end them? To die: to sleep;");
  text.insert(text.end(), "No more; and by a sleep to say we end");
  text.insert(text.end(), "The heart-ache and the thousand natural shocks");
  text.insert(text.end(), "That flesh is heir to, 'tis a consummation");
 
  // вставляется пропущенная вторая строка
  text.insert(text.begin() + 1, "Whether 'tis nobler in the mind to suffer");
 
  // вывод на экран
  for (Text::ConstLine i = text.begin(); i != text.end(); ++i) {
    std::cout << *i << std::endl;
  }
  
  return 0;
};
Xsenon_rus
8 / 8 / 0
Регистрация: 18.04.2011
Сообщений: 104
24.04.2013, 17:12  [ТС]     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку #6
Цитата Сообщение от lemegeton Посмотреть сообщение
Похоже, вы пишете контейнер, абстрагирующий работу с набором строк.
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
#include <cstring>
#include <iostream>
 
class Text {
 public:
  typedef char **Line;
  typedef char *const *ConstLine;
  
  Text() : size(0), capacity(2), text(new char*[capacity]) {}
  Text(const Text &other) : size(0), capacity(2),
    text(new char*[capacity]) {
    insert(begin(), other.begin(), other.end());
  }
  Text &operator=(const Text &other) {
    if (this != &other) {
      clear();
      insert(begin(), other.begin(), other.end());
    }
    return *this;
  }
  virtual ~Text() {
    clear();
    delete [] text;
  }
 
  void clear() {
    for (size_t i = 0; i < size; ++i) {
      delete [] text[i];
    }
    size = 0;
  }
  size_t getSize() const { return size; }
  size_t getCapacity() const { return capacity; }
  size_t getMaximumCapacity() const { return -1; }
 
  ConstLine insert(ConstLine position, const char *string) {
    size_t n = position - begin();
    assureCapacity();
    Line newLine = begin() + n;
    for (Line i = text + size; i != newLine; --i) {
      *i = *(i - 1);
    }
    *newLine = strcpy(new char[strlen(string) + 1], string);
    ++size;
    return newLine;
  }
  void insert(ConstLine position, ConstLine first, ConstLine last) {
    while (first != last) {
      position = insert(position, *first) + 1;
    }
  }
  void erase(ConstLine position) {
    for (Line i = text + (position - begin()); i != end() - 1; ++i) {
      *i = *(i + 1);
    }
    --size;
  }
 
  Line begin() { return text; }
  ConstLine begin() const { return text; }
  Line end() { return text + size; }
  ConstLine end() const { return text + size; }
 private:
  void assureCapacity() {
    if (size >= capacity - 1) {
      capacity += 1;
      char **newText = new char*[capacity];
      for (size_t i = 0; i < size; ++i) {
        newText[i] = text[i];
      }
      delete [] text;
      text = newText;
    }
  }
  size_t size;
  size_t capacity;
  char **text;
};
 
int main(int argc, char *argv[]) {
  Text text;
  // добавление строк в конец
  text.insert(text.end(), "To be, or not to be: that is the question:");
  text.insert(text.end(), "The slings and arrows of outrageous fortune,");
  text.insert(text.end(), "Or to take arms against a sea of troubles,");
  text.insert(text.end(), "And by opposing end them? To die: to sleep;");
  text.insert(text.end(), "No more; and by a sleep to say we end");
  text.insert(text.end(), "The heart-ache and the thousand natural shocks");
  text.insert(text.end(), "That flesh is heir to, 'tis a consummation");
 
  // вставляется пропущенная вторая строка
  text.insert(text.begin() + 1, "Whether 'tis nobler in the mind to suffer");
 
  // вывод на экран
  for (Text::ConstLine i = text.begin(); i != text.end(); ++i) {
    std::cout << *i << std::endl;
  }
  
  return 0;
};
Вы все верно написали, просто в моем случае, как я написал в начале нельзя пользоваться <cstring> и <string.h>

Добавлено через 3 минуты
Я придумал только для вставки строки , что-то типа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Text::Zdvig(int pos1, int pos2)
{
    char temp[256];
    int i = 0;
 
    for (i = 0; m_text[pos2][i] != '\0'; ++i)
    {
        m_text[pos2+1][i]= m_text[pos2][i];
    }
 
    m_text[pos2+1][i] = '\0';
 
    for (i = 0; m_text[pos1][i] !='\0'; ++i)
    {
        m_text[pos2][i] = m_text[pos1][i];
    }
    m_text[pos2][i] = '\0';
}
Это сдвиг, а потом у меня идет вставка на нужное место. Но как вставить в предложение в строке я все ещё не пойму.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2013, 19:26     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку
Еще ссылки по теме:

C++ Дана последовательность целых чисел. Вставить новый элемент перед всеми четными элементами
В тексте после указанного символа вставить подстроку C++
Вставить строку перед каждым вхождением заданного символа C++

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2908 / 1337 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
24.04.2013, 19:26     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку #7
Цитата Сообщение от Xsenon_rus Посмотреть сообщение
Но при этом нельзя пользоваться string.
Под string уже давно (где-то с 2000) понимают STL std::string, а cstring -- лишь набор функций.

Цитата Сообщение от Xsenon_rus Посмотреть сообщение
просто в моем случае, как я написал в начале нельзя пользоваться <cstring> и <string.h>
Это ограничение просто обходится:
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
#include <iostream>
 
size_t strlen(const char *string) {
  size_t result = 0;
  while (*string++ != '\0') {
    ++result;
  }
  return result;
}
 
char *strcpy(char *destination, const char *source) {
  char *result = destination;
  while (*source != '\0') {
    *destination++ = *source++;
  }
  *destination = '\0';
  return result;
}
 
class Text {
 public:
  typedef char **Line;
  typedef char *const *ConstLine;
  
  Text() : size(0), capacity(2), text(new char*[capacity]) {}
  Text(const Text &other) : size(0), capacity(2),
    text(new char*[capacity]) {
    insert(begin(), other.begin(), other.end());
  }
  Text &operator=(const Text &other) {
    if (this != &other) {
      clear();
      insert(begin(), other.begin(), other.end());
    }
    return *this;
  }
  virtual ~Text() {
    clear();
    delete [] text;
  }
 
  void clear() {
    for (size_t i = 0; i < size; ++i) {
      delete [] text[i];
    }
    size = 0;
  }
  size_t getSize() const { return size; }
  size_t getCapacity() const { return capacity; }
  size_t getMaximumCapacity() const { return -1; }
 
  ConstLine insert(ConstLine position, const char *string) {
    size_t n = position - begin();
    assureCapacity();
    Line newLine = begin() + n;
    for (Line i = text + size; i != newLine; --i) {
      *i = *(i - 1);
    }
    *newLine = strcpy(new char[strlen(string) + 1], string);
    ++size;
    return newLine;
  }
  void insert(ConstLine position, ConstLine first, ConstLine last) {
    while (first != last) {
      position = insert(position, *first) + 1;
    }
  }
  void erase(ConstLine position) {
    for (Line i = text + (position - begin()); i != end() - 1; ++i) {
      *i = *(i + 1);
    }
    --size;
  }
 
  Line begin() { return text; }
  ConstLine begin() const { return text; }
  Line end() { return text + size; }
  ConstLine end() const { return text + size; }
 private:
  void assureCapacity() {
    if (size >= capacity - 1) {
      capacity += 1;
      char **newText = new char*[capacity];
      for (size_t i = 0; i < size; ++i) {
        newText[i] = text[i];
      }
      delete [] text;
      text = newText;
    }
  }
  size_t size;
  size_t capacity;
  char **text;
};
 
int main(int argc, char *argv[]) {
  Text text;
  // добавление строк в конец
  text.insert(text.end(), "To be, or not to be: that is the question:");
  text.insert(text.end(), "The slings and arrows of outrageous fortune,");
  text.insert(text.end(), "Or to take arms against a sea of troubles,");
  text.insert(text.end(), "And by opposing end them? To die: to sleep;");
  text.insert(text.end(), "No more; and by a sleep to say we end");
  text.insert(text.end(), "The heart-ache and the thousand natural shocks");
  text.insert(text.end(), "That flesh is heir to, 'tis a consummation");
 
  // вставляется пропущенная вторая строка
  text.insert(text.begin() + 1, "Whether 'tis nobler in the mind to suffer");
 
  // вывод на экран
  for (Text::ConstLine i = text.begin(); i != text.end(); ++i) {
    std::cout << *i << std::endl;
  }
  
  return 0;
};
Цитата Сообщение от Xsenon_rus Посмотреть сообщение
Текст, представляющий собой последовательность строк
Т.е. текст является набором строк. Как хранить набор строк -- не сказано, но уточнение, что строка имеет максимальную длину косвенно указывает, что нужен массив строк.

Если вы все хотите хранить в одной здоровенной строке, тогда все усложняется.

Добавлено через 4 минуты
Объект будет очень негибким, работа с таким объектом будет крайне неуклюжей, да и с точки зрения декомпозиции, объект хранящий текст в виде одного огромного массива символов -- глупость.
Yandex
Объявления
24.04.2013, 19:26     Вставить в последовательность строк, начиная (заканчивая) с текущей, после (перед) заданного контекста заданную подстроку
Ответ Создать тему
Опции темы

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