Scalenie łańcucha znaków

0

Witam, mam taki problem:

Robię zdanie polegające na łamaniu szyfru Cezara na podstawie bazy słów wczytywanej z pliku.
Szyfrogram mam wczytany do tablicy char zdanie, tak samo bazę słów wrzuciłem sobie cała do jednej tablicy char.
Teraz chcę zrobić tak, żeby pętlą for przechodzić po każdym znaku szyfrogramu(aż do napotkania spacji), kolejne znaki dodawać do jakiegoś chara slowo, a kiedy napotkam spację będę sprawdzał, czy dane slowo znajduje sie w bazie.

Problem polega na tym, że chciałem scalać te napisy funkcją strcat, niestety program się nie kompiluje.
Wrzucam kawałek kodu:


void lamanie(char tekst_zaszyf[]){

	//pomocnicza zmienna do rozdzielania zdania zaszyfrowanego na slowa
	char slowo[300] = "" ;
	


	int dlugosc = strlen(tekst_zaszyf);

	//zmienna pomocnicza do petli
	int i;


	for (i = 0; i < dlugosc; i++){
		
		if (tekst_zaszyf[i] != 32) 
			strcat(slowo, tekst_zaszyf[i]);
		
	}
	

Funkcje strcat znalazłem w internecie, poczytałem przykłady i zrozumiałem tak, że po prostu scala ona łańcuchy znaków w jeden.

tekst_zaszyf jest tablica charów(tutaj jest własnie ten szyfrogram).

Myślałem, że coś takiego mi wyjdzie, w mojej koncepcji już było bardzo blisko końca zadania :P
Jakieś rady?

0

Szyfr Cezara ma tylko 25 wariantów wyświetl wszystkie - człowiek z pierwszego rzutu oka wskaże który klucz jest poprawny.

0

Właśnie niestety muszę zrobic tak, żeby program sam zdecydował, który wariant jest poprawny :/
Wkleję może treść zadania:

Łamanie szyfru bedzie sie odbywac w oparciu o fakt, ze łamiacy szyfr bedzie
posiadał baze słów, sposród których któres na pewno znajduje sie w tekscie.
Dzieki temu, próbujac wszytkich mozliwosci dekryptazu (a jest ich tyle, ile liter
w alfabecie łacinskim), wybierze poprawna przez sprawdzenie czy znajduje sie
tam dane słowo. Oczywiscie taki algorytm nie jest do konca jednoznaczny,
jednak powinien działac rozsadnie przy krótkich wiadomosciach. Wiadomosc
oryginalna, szyfrowana oraz baza danych słów-kluczy maja byc wczytywane z
pliku.

1

W takim razie nie potrzebujesz żadnego sklejania.

unsigned bestcount=0,bestkey=0;
for(unsigned key=1;key<26;++key)
  {
   Cesar(dst,src,key);
   unsigned count=0;
   FILE *fd=fopen("vocabulary.txt","r");
   while(fscanf(fd,"%s",word)==1) if(strstr(dst,word)) ++count;
   fclose(fd);
   if(bestcount<count) { bestcount=count; bestkey=key; }
  }
Cesar(dst,src,bestkey);
0

Mógłbyś mi troszkę wyjaśnić, co się u Ciebie dzieje?
Moj program, jak na razie, otwierał sobie plik z szyfrogramem, zapisywał sobie wszystko do tablicy charów, to samo robił z bazą słów.
Szyfrogram i baza słów sa zbudowane na zasadzie:

SŁOWO SŁOWO SŁOWO
SŁOWO
SŁOWO SŁOWO

itd randomowo.

0

szyfrogram wczytuj jako jeden napis.
baza wczytywana w tym algorytmie.

0

Zapytam, bo nie wiem czy do końca rozumiem to, co napisałeś wyzej.

Funkcja Cesar bierze ciag znakow src, przesuwa go o liczbę miejsc key i wynik zapisuje do dst, tak?

A w pętli for wczytujesz sobie w każdej kolejnej iteracji kolejne słowa?

0

Przesuwanie ciągu to zmiana pozycji liter, zaś funkcja dekoduje kluczem key.
Tak.

0

Przepraszam, że pytam, ale kto pyta, nie błądzi ;P

Czyli podsumowując, jeśli stworzę sobie taką funkcje Cesar (już taką mam), to po wczytaniu z pliku szyfrogramu i zastosowaniu Twojej metody dostanę poprawny wynik, tak? Do takiego wniosku doszedłem analizując Twoj kod, jednak wolę zapytać ;)

1

tak.

0

Eksta, wielkie dzięki za pomoc. Zabieram się do poprawek. Dam znać, jak już wyjdzie ;)

0

Jeszcze tylko spytam, czym jest u Ciebie zmienna word? Po prostu zmienną, która przechowuje kolejne słowa?

0

Gdzieś te słowa musisz wczytać.

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