Создайте в классе String метод void erase(int), который удаляет из этой строки символ по индексу.
В этой задаче введите строку с помощью класса String, введите число и выведите строку без удаленного символа обратно на экран.
Формат входных данных
В первой строке вводится одна строка длины не более 105 символов. Во второй строке вводится целое неотрицательное число, не превосходящее длину введенной строки. Все символы имеют ASCII-коды в диапазоне от 32 до 126.
Формат выходных данных
В единственной строке необходимо вывести измененную строку.
входные данные
Hello, World!
12
выходные данные
Hello, World
С этим мэйном:
int main() {
String s;
int i;
cin >> s >> i;
s.erase(i);
cout << s;
return 0;
}
C/C++
Помогите пожалуйста с c++
#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;
}
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() {
cout << "String: ";
String str;
getline(cin, str);
cout << "Index: ";
size_t index;
cin >> index;
str.erase(index);
cout << "String: " << str << '\n';
system("pause > nul");
}
P.S. С вашим main тоже будет работать, при условии, что после пробела вы ведёте индекс
#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;
}
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() {
cout << "String: ";
String str;
getline(cin, str);
cout << "Index: ";
size_t index;
cin >> index;
str.erase(index);
cout << "String: " << str << '\n';
system("pause > nul");
}
P.S. С вашим main тоже будет работать, при условии, что после пробела вы ведёте индекс
Похожие вопросы
- Помогите пожалуйста с C++
- Прошу, помогите пожалуйста с C++
- Помогите пожалуйста с C++
- Помогите пожалуйста с C++.
- Здравствуйте помогите пожалуйста программирование c++
- Помогите решить задачу пожалуйста, в C++
- Помогите пожалуйста написать код.(C++)
- Помогите пожалуйста - создать 4 массива на c++
- Помогите, пожалуйста решить на C++, используя многомерные статические массивы
- Помогите пожалуйста написать код на c++, выводящий имя, фамилию и дату рождения нескольких человек