Zamiana słów w tekście

0

Witam.
Mam problem z programem do zamiany wyrazów w tekście. Przyjmuje on 4 argumenty 1.Plik wejsciowy 2. Plik wyjsciowy 3. Wyraz zamieniany 4. Wyraz, na który chcemy zmienić.
Ogólnie działa jak powinien, tylko jest kłopot gdy chce się zamienić np. kot na kotek, to wtedy pętla robi się w nieskończoność, staje przy pierwszym wyrazie znalezionym w pliku. Próbowałem coś z tym zrobić, lecz nic nie wychodzi.
Kod:

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main(int argc, char* argv[]) {

string s;
int i=1;
string szukaj=argv[3];
string zmiana=argv[4];

ifstream wej;
wej.open(argv[1],ifstream::in);
if(!wej.is_open()) cout << "Blad otwarcia pliku";

ofstream wyj;
wyj.open(argv[2],ofstream::out);
if(!wyj.is_open()) cout << "Blad otwarcia pliku";

size_t len = szukaj.length();

while(getline(wej, s)) {
while(true) {
size_t pos = s.find(szukaj);

if(pos != string:: npos) {
  s.replace(pos, len, zmiana);		
  cout << i <<", " << pos+1 << endl;					  
}
else 
  break; 
}

i++;
wyj << s << endl;
}

wej.close();
wyj.close();
return 0;
}

1

blad jest bardzo prosty.

Czytasz linie masz np

Ala ma kota a kot ma ale

i szukasz ciagu "kot" tutaj znajdzie takze w kota i bedzie chcial to zamienic na kotek. Ale jak zamienisz na kotek to nadal on znajdzie kot w kotek dlatego jest infinitive loop

Najprostsze rozwiazanie? Szukaj dokladnie tego slowa czyli po tym slowie sprawdz nastepny znak, jezeli jest on znakiem bialym lub separatorem (, . ! : itd) to wtedy zmien slowo, w innym wypadku go nie zmieniaj. Jak znalazles juz slowo oznacz je jako "przerobione" czyli

  • albo dodaj do tymczasowej tablicy miejsce wskaznika gdzie juz odwiedziles i sprawdzaj za kazdym razem czy nie ma w pomocniczej tablicy tego wskaznika
  • albo zapamietuj adres wskaznika tak by zaczynal poszukiwania od znalezionegoSlowa + dlugoscSlowa (tak by je pominac)

drugi sposob efektywniejszy

1
for(size_t pos=0;(pos=s.find(szukaj,pos))!=string::npos;pos+=zmiana.size()-1) s.replace(pos,szukaj.size(),zmiana);

1 użytkowników online, w tym zalogowanych: 0, gości: 1