Софтуерно Инженерство
Loading...
nivalen avatar nivalen 0 Точки

Задача 5 от домашно 2 (String replace)

Използвам това парче от код да заместя всяко съвпадение на substring  в string, но понеже надхвърлям дължината на стринга ми дава грешка. Някакви идеи как да се предотврати? 

#include <iostream>
using namespace std;

string changeText(string text, string search, string replace) {
	string result;
	while (1) {
		if (text.find(search) < 0) {
			break;
		}
		result = text.replace(text.find(search), search.length(), replace);
	}
	return result;
}


int main()
{
	string text = "I am the night. Dark Night! No, not the knight";
	string search = "night";
	string replace = "day";
	
	cout << changeText(text, search, replace) << endl;
	return 0;
}

 

Тагове:
0
C++ Programming
MartinBG avatar MartinBG 814 Точки

Имаш няколко проблема с changeText - излишна променлива (result),  грешна проверка за намерен стринг (използвай std::string::npos), не много изчистена логика. Бих ти препоръчал да прочетеш повече за find метода - в линка има и примерен код.

 

Ето работещо решение на changeText с уговорката, че това не е най-оптималното решение*:

string changeText(string text, string search, string replace) {
    while (text.find(search) != std::string::npos) {
        text.replace(text.find(search), search.length(), replace);
    }
    return text;
}

 

[*] - changeText претърсва стринга 2 пъти за всяко съвпадение, гетва дължината на search стринга за всяко заместване. Mоже да се трансформира до void.

0
17/03/2017 17:59:33
gydigydi avatar gydigydi 12 Точки

цикалъти ти се завърта 3 пъти

1. позиция 9 -вярно

2, позиция 39 вярно

3. когато трябва да ти даде бреак-изход числото е 4294967295 по голямо от 0 и не излиза от цикъла а продължава да замества ГРЕШНО  в стринга и ти дава ръмтайм ерор. Компилатора така си го е замислил.

Ако смениш if (result.find(search)<0) break; на if (result.find(search)== string::npos) break;

всичко е ок!

Това дали е оптимална програмата не е задача на упражнението.

Компилаторски му работи! едно -1 не може да върне като хората.

абе C...

 

1