Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2019, 01:14   #1
Tier_Mia
Пользователь
 
Регистрация: 13.10.2019
Сообщений: 14
По умолчанию Помогите найти ошибку

Код:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	vector<char> text;
	vector<char>::iterator it;
	char symb;
	char symb1;
	char symb2;
	cout << "write the symbol you want to be replaced" << endl;
	cin >> symb1;
	cout << "write the new symbol " << endl;
	cin >> symb2;
	cout << "write the amount of the symbols " << endl;
	int amount;
	cin >> amount;
	cout << "Your string is " << endl;
	for (int i = 0; i <= amount; ++i)
	{
		cin >> symb;
		text.push_back(symb);
		
	}
	for (it = text.begin(); it != text.end(); ++it)
	{
		if (*it = symb1)
		{
			it = text.erase(it);
			it = text.insert(it, symb2);
		}
	}
	for (int i = 0; i <= amount; ++i)
	{
		cout << text[i];

	}
	return main();
	
}
Задание такое: надо заменить один символ на другой в строке. Код работает, но не совсем правильно
В первом цикле я вывожу просто строку, во втором - делаю замену, а в 3 цикле заново хочу вывести новый вектор

Последний раз редактировалось Tier_Mia; 07.11.2019 в 01:17.
Tier_Mia вне форума Ответить с цитированием
Старый 07.11.2019, 20:52   #2
Desc
Участник клуба
 
Аватар для Desc
 
Регистрация: 21.11.2007
Сообщений: 1,063
По умолчанию

Цитата:
Сообщение от Tier_Mia Посмотреть сообщение
В первом цикле я вывожу просто строку
Наоборот, вводите символы в цикле.
I am not a wizard, I am just learning.
Desc вне форума Ответить с цитированием
Старый 07.11.2019, 20:59   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

1. erase инвалидирует итераторы
2. insert может инвалидировать итераторы
3. есть std::replace_if
4. от 0 до amount включительно amount+1 элемент
p51x вне форума Ответить с цитированием
Старый 08.11.2019, 11:45   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

тут всё неправильно
Код:
if (*it = symb1)
		{
			it = text.erase(it);
			it = text.insert(it, symb2);
		}
пробуй так
Код:
if (*it == symb1)
{
	*it=symb2;
}
или так (это замена всего цикла)
Код:
std::replace(text.begin(),text.end(),symb1,symb2);
Алексей1153 вне форума Ответить с цитированием
Старый 10.11.2019, 01:06   #5
Tier_Mia
Пользователь
 
Регистрация: 13.10.2019
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
тут всё неправильно
Код:
if (*it = symb1)
		{
			it = text.erase(it);
			it = text.insert(it, symb2);
		}
пробуй так
Код:
if (*it == symb1)
{
	*it=symb2;
}
или так (это замена всего цикла)
Код:
std::replace(text.begin(),text.end(),symb1,symb2);
Код:
string text;
	getline(cin, text);
	char symb1;
	char symb2;
	cin >> symb1;
	cin >> symb2;
	replace(text.begin(), text.end(), symb1, symb2);
	return main();
почему сейчас не работает тогда? Я же вроде все правильно сделал, нечего не понимаю...
Tier_Mia вне форума Ответить с цитированием
Старый 10.11.2019, 01:20   #6
Tier_Mia
Пользователь
 
Регистрация: 13.10.2019
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
тут всё неправильно
Код:
if (*it = symb1)
		{
			it = text.erase(it);
			it = text.insert(it, symb2);
		}

или так (это замена всего цикла)
Код:
std::replace(text.begin(),text.end(),symb1,symb2);
Код:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	vector<char> text;
	vector<char>::iterator it;
	char symb;
	char symb1;
	char symb2;
	cout << "write the symbol you want to be replaced" << endl;
	cin >> symb1;
	cout << "write the new symbol " << endl;
	cin >> symb2;
	cout << "Your string is " << endl;
	for (it = text.begin(); it != text.end(); ++it)
	{
		cin >> symb;
		text.push_back(symb);
		
	}
	replace(text.begin(), text.end(), symb1, symb2);
	for (it = text.begin(); it != text.end(); ++it)
	{
		cout << *it;

	}
	return main();
	
}
пробуй так
Код:
if (*it == symb1)
{
	*it=symb2;
}
попробовал ещё так, тоже не работает
Tier_Mia вне форума Ответить с цитированием
Старый 10.11.2019, 18:01   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Цитата:
Сообщение от Tier_Mia Посмотреть сообщение
почему сейчас не работает тогда? Я же вроде все правильно сделал, нечего не понимаю...
всё там прекрасно работает, вот попробуй
Код:
	std::string text="1212112";
	char symb1='2';
	char symb2='3';
	std::replace(text.begin(), text.end(), symb1, symb2);
тебе осталось только убрать рекурсивный вызов main() и стек перестанет падать :D
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] найти сумму ряда , посчитать функцию ch(x) и найти абсолютную и относительную погрешности. Помогите найти ошибку! Vladonna Помощь студентам 2 13.09.2018 22:07
Помогите, пожалуйста, найти ошибку в коде (найти сумму факториалов чётных чисел в заданном диапазоне) kris14 Паскаль, Turbo Pascal, PascalABC.NET 8 25.10.2017 15:42
Дан массив а(n) типа SWORD. найти сумму всех отрицательных элементов массива.помогите найти ошибку Юлия123456 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 07.09.2016 06:12
Найти седловые точки в матрице(помогите найти ошибку) - pascal tdsotm Помощь студентам 0 20.11.2014 18:57
Помогите найти ошибку - StrToFloat выдаёт ошибку EConvertError для ячеек StringGrid (Delphi) Artsiom Помощь студентам 10 18.12.2013 14:10