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

Wyszukiwanie wzorca brute force w c++

Object Storage Arubacloud
0 głosów
1,273 wizyt
pytanie zadane 22 czerwca 2018 w C i C++ przez WhiteDragon Początkujący (290 p.)

Mam na zadanie wśród ciągu 10 znaków odnaleźć dany wzorzec składający się z 3 znaków. Metoda jaką mam to zrobić to wyszukiwanie wzorca w brute force.

Kod nie działa,bo cały czas pisze błąd w funkcji,że nie ma konkretnej konwersji string na char.

Pomoże mi ktoś poprawić kod?

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
void Szukaj(string wzorzec, string tekst)
{
	int i = 0, j = 0;
	while (i<strlen(wzorzec) && j<strlen(tekst))
	{
		if (wzorzec[i] != tekst[j])
		{
			j -= i - 1;
			i = 0;
		}
		else {
			j++;
			i++;
		}
	}
	if (i == strlen(wzorzec))
	{
		cout << j - i;
	}
	else
	{
		cout << -1;
	}
}


int main()
{
	string wzorzec;
	string tekst = "";
	cout << "wpisz wzorzec zlozony z 3 liter" << endl;
	cin >> wzorzec;
	cout << "Wpisz ciag liter";
	char litera;
	if (int i = 0; i < 9; i++)
	{
		cout << "wpisz" << " " << i + 1 << " " << "litere" << " ";
		cin >> litera;
		tekst = tekst + litera;
	}


	cout << Szukaj(wzorzec, tekst) << endl;
	return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 22 czerwca 2018 przez RafalS VIP (122,820 p.)
void Szukaj(string wzorzec, string tekst)
...
cout << Szukaj(wzorzec, tekst) << endl;

Próbujesz wypisać void :D

string wzorzec;
strlen(wzorzec);

nie ma funkcji strlen(std::string). Jest strlen(const char*) w nagłówku <cstring> lub <string.h>. Tutaj ta funkcja znalazła się przez przypadek z ktoregoś z nagłówków. 

Jeśli chcesz sprawdzić długość stringa to wywołaj jego metodę - length() w ten sposób:

int dlugosc = wzorzec.length();

A tutaj:

if (int i = 0; i < 9; i++)

pomyliłeś ifa z forem :D

komentarz 22 czerwca 2018 przez WhiteDragon Początkujący (290 p.)
Ok,if poprawiony ale co zrobić z voidem w funkcji?Dać string? No i co zrobić by to działało.... nie mam pojęcia
komentarz 22 czerwca 2018 przez RafalS VIP (122,820 p.)

Zostaw void, ale nie wpisuj wyniku funkcji. Czyli:

Szukaj(wzorzec, tekst);

 

komentarz 22 czerwca 2018 przez RafalS VIP (122,820 p.)
Poza tym widze we piszesz w visual studio, a on daje dosyć dobre komunikaty przy bledach. Naucz sie je czytać :p
komentarz 22 czerwca 2018 przez WhiteDragon Początkujący (290 p.)

Czytać umiem,ale nie znam tych błędów ,które mimo tego wciąż się pojawiają. Czytałam o konwersji ale nie widzę po co tu ona...

- E0413    brak odpowiedniej funkcji konwersji elementu "std::string" na "const char *"  

-C2664    „size_t strlen(const char *)”: nie można dokonać konwersji argumentu 1 z „std::string” do „const char *”   

 

 

komentarz 23 czerwca 2018 przez WhiteDragon Początkujący (290 p.)

Oki,poprawione by nie używać konwersji na char zrobiłem tablice char ale teraz problem z lokowaniem pamięci w funkcji.

Co poprawić?

 

Szczegóły błędu:

Zgłoszono nieobsługiwany wyjątek: naruszenie dostępu do odczytu.
**i** było nullptr.: wystąpił wyjątek

Kod:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
void Szukaj(char wzorzec, char tab)
{
	int *i = 0, *j = 0;
	while (*i<wzorzec && *j<tab)
	{
		if (wzorzec[i] !=tab[j])
		{
			j -= *i - 1;
			i = 0;
		}
		else {
			j++;
			i++;
		}
	}
	if (*i == wzorzec)
	{
		cout << j - i;
	}
	else
	{
		cout << -1;
	}
}


int main()
{
	char wzorzec[3];
	char znak;
	char tab[10];
	cout << "wpisz wzorzec zlozony z 3 liter" << endl;
	
	for (int i = 0; i<3; i++)//WPISUJE WZORZEC
	{
		cout << "Wpisz" << " " << i + 1 << " " << "litere" << " "; cin >> wzorzec[i];
	}
	cout << "Wpisz ciag liter";
	for (int i = 0; i<10; i++)//WPISUJE CIAG LITER
	{
		cout << "wpisz" << " " << i + 1 << " " << "litere" << " ";
		cin >> znak;
		tab[i] = znak;
	
	}
	Szukaj(wzorzec[3],tab[10]);
	return 0;
}

 

komentarz 23 czerwca 2018 przez RafalS VIP (122,820 p.)

yyyy:

	int *i = 0, *j = 0;
	while (*i<wzorzec && *j<tab)

nie tak działają wskaźniki :P. Jeśli wskaźnik na nic nie pokazuje a Ty spróbujesz dobrać się do tego na co pokazuje to poleci właśnie ten wyjątek. Żeby zainicjować wskaźnik niczym używa się albo 0, albo NULL, albo nullptr, co zrobiłeś Ty i o czym powiedział Ci kompilator:

**i** było nullptr

Te dwie liniki totalnie nie mają sensu, po jaką cholere i oraz j mają być wskaźnikami na inty? Jeśli są to zwykłe liczniki tzw iteratory to niech będą zwykłymi intami.
Ponadto:

void Szukaj(char wzorzec, char tab)
...
Szukaj(wzorzec[3],tab[10]);

Przesyłasz do tej funkcji pojedyncze literki, a potem próbujesz używać je jak tablicy:

if (wzorzec[i] !=tab[j])

 

komentarz 23 czerwca 2018 przez RafalS VIP (122,820 p.)

Czytać umiem,ale nie znam tych błędów ,które mimo tego wciąż się pojawiają. Czytałam o konwersji ale nie widzę po co tu ona...

- E0413    brak odpowiedniej funkcji konwersji elementu "std::string" na "const char *"  

-C2664    „size_t strlen(const char *)”: nie można dokonać konwersji argumentu 1 z „std::string” do „const char *”   

Spróbuje jeszcze raz. Jeśli funkcja przyjmuje jeden typ a próbujesz ją wywołać z innym to kompilator sprobuje dokonać konwersji do typu, którego funkcja się spodziewa. Np:

#include <iostream>
using namespace std;
void funkcja(int x) {
	cout << x << endl;
}
int main() {
	funkcja(1.99);
}

Co się dzieje? Kompilator widzi wywołanie funkcji o nazwie funkcja z jednym parametrem typu double. Taka funkcja nie istnieje, ale istnieje taka ktora przyjmuja inta. Istnieje także konwersja z double do inta, więc kompilator dokonuje niejawnej (takiej po cichu, nikt jej świadomie nie wywołal a i tak sie odbyła) konwersji z double na int i wywołuje funkcje.

U Ciebie sytuacja wyglądała tak:

#include <iostream>
using namespace std;
int funkcja(const char* napis) {
	int dlugosc = 0;
	if (napis == 0)
		return dlugosc;
	else
		while (napis[dlugosc] != '\0')
			dlugosc++;
	return dlugosc;
}
int main() {
	string napis_string = "ale jaja panie ferdku";
	const char* napis_tablica = "kto by pomyslal";
	cout << funkcja(napis_tablica) << endl;
	//kompilator nie zna funkcji funkcja(string), ale zna
	//funkcja(const char*) wiec probuje konwertowac string na
	//const char*, ale takiej konwersji tez nie potrafi zrobic
	//bo nie została zdefiniowana, wiec nie krzyczy ze nie zna funkcji
	//tylko ze nie potrafi zrobic konwersji
	cout << funkcja(napis_string) << endl;

	//mozna by wykorzystac fakt, ze string ma metode
	//ktora zwraca const char*
	cout << funkcja(napis_string.c_str()) << endl;
	//teraz wszystko jest ok, ale to bez sensu, bo
	//string sam w sobie potrafi Ci powiedziec jak dlugi jest
	cout << napis_string.length() << endl;
}

 

Podobne pytania

0 głosów
1 odpowiedź 2,329 wizyt
pytanie zadane 20 lipca 2016 w C i C++ przez phaxe Nowicjusz (120 p.)
0 głosów
1 odpowiedź 555 wizyt
pytanie zadane 9 marca 2023 w Python przez pythonbegnner02 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 220 wizyt
pytanie zadane 6 maja 2021 w Bezpieczeństwo, hacking przez MrMoon Użytkownik (960 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...