• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PROGRAM CENZURA C++ BŁĄD

0 głosów
493 wizyt
pytanie zadane 9 września 2018 w C i C++ przez Archeon Początkujący (480 p.)

Witam,

Aktualnie uczę się programowania w języku C++. Wpadłem na pomysł żeby zrobić program który będzie cenzurował wyrazy które sobie sam ustalę. Napisałem program, który się kompiluje i odpala, ale w pewnym momencie wywala taki błąd : 

Czy ktoś potrafi mi powiedzieć jak powinienem to naprawić ? 

 

Oto mój kod : 

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;
void powitanie()
{
	cout << "Witaj w programie CENZURA v1." << endl;
	
}
void autor()
{
	cout << "Autor programu: Archeon " << endl;
	cout << "Student II roku Informatyki  " << endl;
}

void menu()
{
	cout << "|_____Cenzura v1 ____|" << endl;
	cout << endl;
	cout << "1. Przetestuj program " << endl;
	cout << "2. O programie " << endl;
	cout << "3. O autorze " << endl;
	cout << "4. Wyście " << endl;
	cout << endl << endl;
	cout << "Wybierz opcje : " << endl;
}

void program()
{
	cout <<"Program ma nanosic cenzure na brzydkie wyrazy :)" << endl;
}


string cenzura(string & Tekst  )
{
string sWynik;

	// ZAMIANA ***** na "*****" //
	
string przeklenstwo_k = "kurka";
string przeklenstwo_k_cenzura = "*****";
size_t dlugosc_przeklenstwo_k = przeklenstwo_k.size();
size_t znalezione_przeklenstwo_k = Tekst.find ( przeklenstwo_k );

do
{
	Tekst.erase(znalezione_przeklenstwo_k, dlugosc_przeklenstwo_k);
	Tekst.insert(znalezione_przeklenstwo_k,przeklenstwo_k_cenzura);
	znalezione_przeklenstwo_k = Tekst.find(przeklenstwo_k);
}while(znalezione_przeklenstwo_k != string::npos);	

sWynik = Tekst;
return sWynik;

}















int main(int argc, char** argv) {
	
system("chcp 1250");
system("cls");	
powitanie();
Sleep(1000);
system("cls");
menu();	
int wybor;
string tekst;
cin >> wybor;

switch(	wybor )
{
	case 1: 
	{
	cout << "Test programu  " << endl;
		Sleep(1000);
		system("cls");
		cout << "Podaj wyraz aby zobaczyć cenzurę :";
		getline(cin, tekst);
		cout << cenzura( tekst ) << endl;
	break;
	}
	
	case 2:
		system("cls");
		program();	
	break;
	case 3:
		autor();	
	break;
	case 4:
		system("cls");
		cout << "Nastąpi wyjście z programu .." << endl;
		system("exit");	
	break;	
}
		
	
	
	
	
	
	return 0;
}

 

komentarz 9 września 2018 przez Secrus Nałogowiec (32,880 p.)
przeczytaj tresc bledu. przy funkcji erase wychodzisz poza zakres stringa (nie patrzylem w kod, jedynie wnioskuje z tresci bledu).

1 odpowiedź

0 głosów
odpowiedź 9 września 2018 przez niezalogowany
edycja 9 września 2018

Nie sprawdzałem dokładnie Twojego kodu, ale gdy przekleństwo niezostanie znalezione próbujesz coś wycinać i wstawiać. Lepiej byłoby od razu użyć funkcji std::string::replace:

string cenzura(const string & tekst)
{
    string przeklenstwo_k = "kurka";

    string sWynik = tekst;
    size_t pos = 0;
    while ((pos = sWynik.find(przeklenstwo_k, pos)) != string::npos)
    {
        sWynik.replace(pos, przeklenstwo_k.size(), przeklenstwo_k.size(), '*');
        pos += przeklenstwo_k.size();
    }
    return sWynik;
}

PS. Przed getline powinieneś wstawić cin.ignore.

komentarz 9 września 2018 przez Archeon Początkujący (480 p.)
Wstawiłem cin.ignore i działa ten mój kod. Wielkie dzięki !

Jestem początkujący z c++ i dopiero się uczę.

Czyli lepiej używać string replace niz erase?
komentarz 9 września 2018 przez niezalogowany
Poprawiłem troszkę kod. Jest to na pewno wygodniejsze :) Przy tej samej ilości znaków kompilator nie będzie ich wycinał z łańcucha, a po prostu je zamieni (znacznie szybsze rozwiązanie).
komentarz 9 września 2018 przez Archeon Początkujący (480 p.)
Jeszcze mam jedno pytanie .. Jak już mam gotowy program i chcę go uruchomić z poziomu systemu, czyli poprzez aplikacje.exe jak mam to zrobić aby poprawnie działał ?
komentarz 9 września 2018 przez niezalogowany
Z poziomu konsoli?
komentarz 9 września 2018 przez Archeon Początkujący (480 p.)
A nie da się jakoś inaczej zrobić tak, że jak się kliknie w ikone programu.exe i się odpali?
komentarz 9 września 2018 przez niezalogowany
No przecież zawsze można dwa razy kliknąć na .exe i się odpali
komentarz 9 września 2018 przez Archeon Początkujący (480 p.)
Właśnie o to chodzi że jak tak robię to okno konsoli się odpala, ale funkcje np z poziomu menu już nie działają ( po wybraniu opcji, konsola się zamyka) ..
komentarz 9 września 2018 przez niezalogowany
One działają tylko program czyta dalsze instrukcje i dochodzi w ułamku sekundy do return 0 gdzie program się kończy. Możesz w tym miejscu zatrzymać program (np z użyciem cin.get()). Możesz też użyć pętli, aby po wybraniu danej opcji można było wrócić do menu.
komentarz 9 września 2018 przez Archeon Początkujący (480 p.)
Okej, dzięki wielkie !

Podobne pytania

0 głosów
1 odpowiedź 501 wizyt
pytanie zadane 10 września 2018 w C i C++ przez Archeon Początkujący (480 p.)
+2 głosów
2 odpowiedzi 729 wizyt
pytanie zadane 7 maja 2018 w Offtop przez NIMuser Stary wyjadacz (11,030 p.)
0 głosów
1 odpowiedź 619 wizyt
pytanie zadane 5 kwietnia 2018 w PHP przez OdsetekGlupoty Pasjonat (15,360 p.)

93,424 zapytań

142,421 odpowiedzi

322,643 komentarzy

62,782 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...