Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
#1

Динамически распределяемая память, удаление символов в строке - C++

30.06.2016, 12:16. Просмотров 405. Ответов 15
Метки нет (Все метки)

Нужна помощь в написании программы:
Удаление символов Написать функцию, обеспечивающую ввод с клавиатуры строки неограниченной длины без редактирования. Написать функцию, которая удаляет символы, стоящие между двумя определенными символами. Символ вводится пользователем.

Примечание: В каждой задаче должна быть реализована проверка на целостность кучи. При работе со строками учитывать символ конца строки (байт с нулевым значением).
Заполнение элементов массива (там, где это требуется) должно быть реализовано в виде отдельной функции. В этой функции запрашивается количество элементов массива, затем пользователю предоставляется выбор – либо вводить массив с клавиатуры, либо заполнить его автоматически (случайными числами).
В случаях, когда функция сама формирует массив, она должна посредством своих аргументов (объявленных как указатели) передать в вызывающую программу новый массив и число его элементов. Возвращаемое функцией число должно означать код ошибки (например, 0 – нет ошибки, ненулевое число – код конкретной ошибки). Во всех задачах, где необходимо вводить строки (не)ограниченной длины без редактирования, следует иметь в виду, что для хранения строки необходимо использовать динамическую память. Размер блока, выделенного под строку, увеличивается при вводе очередного символа. Строка генерируется внутри функции ввода. Функция возвращает указатель на начало строки. Ввод строки завершается при нажатии клавиши Enter, код Enter в строке не сохраняется.
Если на каком-либо этапе память выделить невозможно, то необходимо освободить всю выделенную ранее память и завершить программу. Особое внимание уделить обработке различных ошибок – при их возникновении необходимо освобождать все ставшие ненужными ресурсы. При формировании нового массива можно реализовать любой из следующих алгоритмов, либо разработать свой: 1) создать новый массив и перенести в него нужные элементы. 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
#include <iostream>
#include <string>
using namespace std;
 
char* del(char *s, char a, char x)
{
    char* p_begin = strchr(x, a);
    char* p_end = strchr(x, a);
 
    for ( ; p_begin != p_end; p_begin++)
    {
        if (*p_begin != a)
            (*p_begin) = '_';
    return s;
}
    
 
int main(int argc, char** argv)
{
    setlocal(LC_ALL, "Russian");
    char x[512];
    char a;
    cout << "Введите символ: " << endl;
    cin >> a;
    cout << "Введите cтроку: " << endl;
    cin >> x;
    cout << "До: " << endl;
    cout << x;
    del(x, a);
    cout << "После: " << endl;
    cout << x;
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2016, 12:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Динамически распределяемая память, удаление символов в строке (C++):

Динамически распределяемая память
Задача С одномерным динамическим массивом, состоящим из n вещественных...

Динамически распределяемая память. Массивы
Доброго времени суток. Помогите пожалуйста решить задачку.:wall: Выборка...

Массивы. Динамически распределяемая память.
Всем привет. Помогите решить задачку. В одномерном массиве, состоящем из n...

Удаление символов-разделителей в строке
Прошу, помогите. Задача: Ввести строку символов. Удалить из строки все...

Выполнить замену и удаление символов в строке. [CPP]
Дана строка. Преобразовать её, заменив точками (.) все запятые (,),...

Память распределить динамически
Задали такую задачу :память матрицы распределить динамически .Найти среднее...

15
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 13:45 #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
#include <iostream>
#include <string>
 
void delete_chars(std::string& line, char del)
{
    for (size_t i = 0; i < line.size() - 2; i++)
    {
        if (line[i] == del && line[i + 2] == del)
            line.erase(i + 1, 1);
    }
}
 
 
int main(int argc, char** argv) {
    setlocale(LC_ALL, "");
 
    std::string line; char character;
 
    std::cout << "Ввод строки: "; std::getline(std::cin, line, '\n');
    std::cout << "Ввод символа: "; std::cin >> character;
 
    delete_chars(line, character);
 
    std::cout << "\n\nОтвет: " << line << std::endl;
}
1
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
30.06.2016, 13:54  [ТС] #3
Не работает. Может в функции delete_chars вместо del нужно подставить character?
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 15:18 #4
narsky, она работает, но не так, как написано в задании, потому что я его невнимательно прочитал. Она удаляет только один символ, а надо, пока не встретит del.
0
Миниатюры
Динамически распределяемая память, удаление символов в строке  
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
30.06.2016, 16:15  [ТС] #5
А если сделать что-то типа такого?
C++
1
2
3
4
5
6
7
8
9
while (i != character)
{
m = i;
i++;
}
for (i = m; i < sizeof(line); i++)
{
if (i != character) line[i] = '_';
}
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 17:40 #6
narsky, советую в std::string считать с помощью std::getline() строку, потом с помощью std::stringstream объекта поглощать каждое слово и обрабатывать его индивидуально. После завершения обработки слова прицепить его ко временному std::string (который надо еще в самом начале создать). И так с каждым словом. Но проблема в том, что если у нас ввод будет такой: haa aah test, то будет немного неприятно, думаю. Ну ты попробуй сам реши эту задачу, а то так не интересно же.

Добавлено через 3 минуты
narsky, а вообще, можно супер-далеко пойти и сделать std::vector<char>, в него считать строку через while-цикл. Потом, в другом цикле пробегаешься по вектору, когда находишь желаемый символ, запоминаешь текущую позицию и начинаешь "отчет" кол-ва символов до встречи повтора. Потом, с помощью std::vector::erase удаляешь в полученном диапозоне значения. Думаю, ты понял
0
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
30.06.2016, 18:29  [ТС] #7
meJevin, я думаю, что здесь пробел считается символом, как и любая другая буква, так что по факту, при вводе строки, допустим, adfasfda kmfas, и вводе символа f, должно выйти: adf__f_____fas
Т.е., все символы до первого появления f и после последнего появления остаются, а все символы между первым и последним f, исключая другие f, должны замениться на "_".

Добавлено через 43 минуты
Извини, я с векторами не работал, но попробую.
Цитата Сообщение от meJevin Посмотреть сообщение
сделать std::vector<char>, в него считать строку через while-цикл.
Вот код, я правильно объявил вектор? И как теперь считать строку через цикл? Посимвольно, но как?
While (?)
{
?
}
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
#include <iostream>
#include <string>
#include <vector>
using namespace std;
 
 
void delete_chars(std::string& line, char del)
{
   std::vector<char> v1;
}
 
 
int main(int argc, char** argv) {
    setlocale(LC_ALL, "");
 
    std::string line; char character;
 
    std::cout << "Ввод строки: "; std::getline(std::cin, line, '\n');
    std::cout << "Ввод символа: "; std::cin >> character;
 
    delete_chars(line, character);
 
    std::cout << "\n\nОтвет: " << line << std::endl;
}
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 19:05 #8
Лучший ответ Сообщение было отмечено narsky как решение

Решение

narsky, стоп, так их всего лишь заменить надо? В таком случае это простейшая задача:
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
#include <iostream>
#include <string>
 
void delete_chars_between(std::string& line, char del)
{
    size_t start = line.find_first_of(del), end = line.find_last_of(del);
 
    for (; start <= end; ++start)
        if (line[start] != del)
            line[start] = '_';
}
 
 
int main(int argc, char** argv) {
    std::string line; char character;
 
    std::cout << "String: "; std::getline(std::cin, line, '\n');
    std::cout << "Char: "; std::cin >> character;
 
    delete_chars_between(line, character);
 
    std::cout << "\n\nAnswer: " << line << std::endl;
 
}
А про векторы - нет, я имел ввиду сразу в него вводить. Вот так:
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <conio.h>
 
void delete_chars_between(std::vector<char>& line, std::string symbol)
{
    auto start = std::find_first_of(std::begin(line), std::end(line), std::begin(symbol), std::end(symbol));
    std::vector<char>::iterator end = std::find_end(std::begin(line), std::end(line), std::begin(symbol), std::end(symbol));
 
    for (; start <= end; ++start)
        if (*start != symbol[0])
            *start = '_';
 
    line.erase(std::remove_if(std::begin(line), std::end(line), [](char c) { return c == '_'; }), line.end());
}
 
 
int main(int argc, char** argv) {
    
    std::vector<char> line; char c;
 
    std::cout << "String: ";
    while (std::cin >> c) {
        line.push_back(c);
        if (std::cin.peek() == '\n') break;
    }
 
    std::cout << "Char: "; std::cin >> c;
 
    delete_chars_between(line, std::string{c});
 
    std::cout << "\n\nAnswer: ";
    for (auto i : line) std::cout << i;
 
    _getch();
}
1
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 19:09 #9
Ну и скриншот есть
0
Миниатюры
Динамически распределяемая память, удаление символов в строке  
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
30.06.2016, 19:12  [ТС] #10
meJevin, я думаю да, но завтра уточню... Большое Вам спасибо!
Цитата Сообщение от meJevin Посмотреть сообщение
Там, правда, последний символ из введенной строки куда-то пропадает.
Там наверно нужно приписать + 1 или что-то вроде того, т.к.
При работе со строками учитывать символ конца строки (байт с нулевым значением).
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 19:13 #11
Цитата Сообщение от narsky Посмотреть сообщение
Там наверно нужно приписать + 1 или что-то вроде того, т.к.
Да не, уже не пропадает, я изменил. Теперь все работает.
0
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
30.06.2016, 19:32  [ТС] #12
У вас почему-то второй код с векторами не работает, по крайней мере у меня. В функции delete_chars_between вместо symbol не должно быть c?
Вы сделали и вариант с полным удалением символов? Не могли бы вы мне скинуть код, на всякий случай? : )
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 19:43 #13
Цитата Сообщение от narsky Посмотреть сообщение
У вас почему-то второй код с векторами не работает, по крайней мере у меня.
У меня все работает. Подрубите последний С++.

Цитата Сообщение от narsky Посмотреть сообщение
В функции delete_chars_between вместо symbol не должно быть c?
Нет, я туда специально передаю std::string, а не char из-за функций, которые я в ней использую. Соответственно, при вызове, я создаю временный std::string с введенным пользователем символом в параметре.
0
Миниатюры
Динамически распределяемая память, удаление символов в строке  
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
30.06.2016, 19:49  [ТС] #14
Цитата Сообщение от meJevin Посмотреть сообщение
У меня все работает. Подрубите последний С++.
А каким образом это сделать? Возможно ли это, если у меня стоит Visual Studio 2012?
Цитата Сообщение от meJevin Посмотреть сообщение
Нет, я туда специально передаю std::string, а не char из-за функций, которые я в ней использую. Соответственно, при вызове, я создаю временный std::string с введенным пользователем символом в параметре.
Вроде бы понятно... Не знал, что так можно делать.
0
meJevin
156 / 148 / 92
Регистрация: 18.11.2015
Сообщений: 674
Завершенные тесты: 1
30.06.2016, 19:51 #15
narsky, а дальше с вами будет он
0
narsky
2 / 2 / 2
Регистрация: 23.03.2016
Сообщений: 117
30.06.2016, 20:08  [ТС] #16
meJevin, не сильно он мне помог
Но все равно спасибо вам большое, дай бог вам здоровья!
0
30.06.2016, 20:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2016, 20:08
Привет! Вот еще темы с решениями:

Динамически выделенная память
Имеем прототип Polinomials operator+(const Polinomials &amp;) const; И имеем...

Запись в динамически выделенную память
Во общем, в dll выделяется память под char *, через new. Требуется в другой...

Удалить динамически выделенную память
Получится ли освободить динамически выделенную память в интерфейсе одного...

Динамически выделить память под массив
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами...


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

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

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