C/C++

Прошу, помогите пожалуйста с C++

Создайте в классе String метод void erase(int, int), который удаляет из этой строки подстроку символов в заданном диапазоне.

В этой задаче введите строку с помощью класса String, введите два числа и выведите строку без удаленных символов обратно на экран.

Формат входных данных
В первой строке вводится одна строка длины не более 105 символов. Во второй строке вводятся два целых неотрицательных числа, не превосходящие длину введенной строки. Гарантируется, что первое число не превосходит второе. Символы имеют ASCII-коды в диапазоне от 32 до 126.

Формат выходных данных
В единственной строке необходимо вывести измененную строку.

входные данные
Hello, World!
5 12
выходные данные
Hello
входные данные
You are welcome
0 7
выходные данные
welcome

Используя этот main:

int main() {
String s;
int i, j;
cin >> s >> i >> j;
s.erase(i, j);
cout << s;
return 0;
}
Malik Jantaev
Malik Jantaev
14
А вот здесь без getline никак! Объект std::cin считывает поток до первого пробельного символа. Для «You are welcome» нужно три объекта String, getline же решает эту проблему!

#include <iostream>
#include <cstring>
using namespace std;
class String {
public:
String() : n(0), str(nullptr) {}
String(const char* cs) : n(strlen(cs)), str(new char[n]) { copy(cs); }
~String() {
if (str != nullptr) {
delete[] str;
str = nullptr;
}
}
String& operator=(const String& s) {
if (&s != this) {
delete[] str;
n = s.n;
str = new char[n];
copy(s.str);
}
return *this;
}
String& operator=(const char* cs) {
if (cs == nullptr) {
n = 0;
str = nullptr;
return *this;
}
if (str != nullptr) delete[] str;
n = strlen(cs);
str = new char[n];
copy(cs);
return *this;
}
void push_back(char ch) {
auto m = n;
char* tmp = new char[m];
for (auto i = 0U; i < m; ++i) tmp[i] = str[i];
delete[] str;
++n;
str = new char[n];
for (auto i = 0U; i < m; ++i) str[i] = tmp[i];
str[m] = ch;
delete[] tmp;
}
void erase(size_t idx) {
if (idx >= n) return;
char* tmp = new char[n - 1];
auto j = 0U;
for (auto i = 0U; i < n; ++i) {
if (i != idx) {
tmp[j] = str[i];
++j;
}
}
delete[] str;
--n;
str = new char[n];
copy(tmp);
delete[] tmp;
}
void erase(size_t first, size_t last) {
if (first >= n) return;
if (first > last) return;
if (last > 1 && last >= n) last = n - 1;
auto m = n + first - last - 1;
char* tmp = new char[m];
auto j = 0U;
for (auto i = 0U; i < n; ++i) {
if (i < first || i > last) {
tmp[j] = str[i];
++j;
}
}
delete[] str;
n = m;
str = new char[n];
copy(tmp);
delete[] tmp;
}
private:
size_t n;
char* str;
void copy(const char* cs) {
for (auto i = 0U; i < n; ++i) str[i] = cs[i];
}
friend ostream& operator<<(ostream& out, const String& s) {
if (!s.n) return out << "";
for (auto i = 0U; i < s.n; ++i) out.put(s.str[i]);
return out;
}
friend istream& operator>>(istream& inp, String& s) {
char tmp[100000];
inp.getline(tmp, 100000);
s = tmp;
return inp;
}
};
istream& getline(istream& inp, String& s) {
char ch = inp.get();
while (ch != '\n') {
s.push_back(ch);
ch = inp.get();
}
return inp;
}
int main() {
String s;
getline(cin, s);
int i, j;
cin >> i >> j;
s.erase(i, j);
cout << s;
system("pause > nul");
}
СТ
Сергей Тиняков
93 417
Лучший ответ
уже есть класс или тебе свой состряпать?
string s;
int i, j;
cout<<"Введите строку... "; getline(cin, s); fflush(stdin);
cout<<"Введите начало вырезания= "; cin>> i; fflush(stdin);
cout<<"Введите количество вырезания= "; cin >> j; fflush(stdin);

s.erase(i, j);
cout << s;
Адилет Камчыбеков class STRuser
{
public:
string s;
STRuser()
{

}

void STRerase(int ii, int jj)
{
s.erase(ii, jj);
}
};
////////////////////////////////////////////////
int main(int argc, char **argv)
{
STRuser s;
int i, j;
cout<<"Введите строку... "; getline(cin, s.s); fflush(stdin);
cout<<"Введите начало вырезания= "; cin>> i; fflush(stdin);
cout<<"Введите количество вырезания= "; cin >> j; fflush(stdin);

s.STRerase(i,j);
cout << s.s;

cout<<endl; system("pause");
return 0;
}