Code:
/*
Napisati program koji ce ucitati post, te u svakoj neprimjerenoj rijeci zamijeniti sva slova osim prvog i zadnjeg znakovima zvjezdica. Rijeci su uzastopni nizovi slova odvojeni razmacima ili interpunkcijskim oznakama. Neprimjerena rijec je rijec cija se barem jedna permutacija znakova nalazi na crnoj listi. Dakle, ako se rijec „krava“ nalazi na crnoj listi, rijec „varka“ je takoder neprimjerena. Koristiti dinamicku alokaciju memorije i aritmetiku pokazivaca.
Ulazni podaci
Post koji je potrebno cenzurirati. Post se sastoji iskljucivo od malih slova engleske abecede, razmaka i interpunkcijskih oznaka. U datoteci cenzura.txt nalazi se broj N (10000 <= N <= 100000), broj rijeci na crnoj listi. U sljedecih N redaka nalaze se rijeci s crne liste, jedna rijec u jednom retku. Rijeci se sastoje iskljucivo od malih slova engleske abecede, a duljina svake rijeci je manja ili jednaka 15 znakova.
Izlazni podaci
U prvi i jedini redak na ekran treba ispisati cenzurirani post u skladu s tekstom zadatka.
Primjer:
ULAZ:
ispit je bio upglu, nista nisam znao.
IZLAZ:
ispit je bio u***u, nista nisam znao.
*/
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
struct rijeci{
char rijec[16];
};
void swap(char* first, char* second)
{
char ch = *second;
*second = *first;
*first = ch;
}
void permute(char* set, int begin, int end)
{
int i;
int range = end - begin;
if (range == 1) {
//cout << set << endl;
ofstream dat;
dat.open("perms.txt",ios::app);
dat<<set<<endl;
dat.close();
} else {
for(i=0; i<range; i++) {
swap(&set[begin], &set[begin+i]); //initial swap
permute(set, begin+1, end); //recursion
swap(&set[begin], &set[begin+i]); //swap back
}
}
}
bool cenzura(char tmp[16]){
ifstream dat;
dat.open("perms.txt");
while(!dat.eof()){
char ucitana[16];
dat.getline(ucitana, sizeof(ucitana));
if(strcmp(tmp,ucitana)==0) return true;
}
dat.close();
return false;
}
int main(){
ifstream dat;
int broj_rijeci;
dat.open("cenzura.txt");
if(dat.fail()){
cout<<"cenzura.txt se nije otvorila.\nProgram se prekida."<<endl;
exit(1);
}
dat>>broj_rijeci;
rijeci * baza_za_cenzuru = new rijeci[broj_rijeci];
for(int i=0; i<broj_rijeci; i++){
dat>>baza_za_cenzuru[i].rijec;
permute(baza_za_cenzuru[i].rijec, 0, strlen(baza_za_cenzuru[i].rijec));
}
dat.close();
char * post = new char[255];
cout<<"Unesite post:"<<endl;
cin.getline(post,255);
int broj_znakova = strlen(post);
int trenutni = 0;
char tmp[16]S= {0};
int indextmp=0;
char cenzuriran[255];
while(1){
if (*(post+trenutni) < 'a' || *(post+trenutni) > 'z' || *(post+trenutni) == '\0'){
if(tmp){
int brtmp = strlen(tmp);
tmp[brtmp+1]='\0';
//cout<<"->"<<brtmp<<"<-"<<endl;
//cout<<"->"<<tmp<<"<-"<<endl;
cout<<tmp<<endl;
if(cenzura(tmp)){
for(int i=trenutni-brtmp+1; i<trenutni-1; i++){
*(post+i)='*';
}
char tmp[16]S= {0};
}
char tmp[16]S= {0};
}
indextmp = 0;
if (*(post+trenutni) == '\0') break;
trenutni++;
continue;
}
tmp[indextmp]S= *(post+trenutni);
indextmp++;
trenutni++;
}
cout<<post<<endl;
delete []Sbaza_za_cenzuru;
delete []Spost;
return 0;
}