Scalenie łańcucha znaków

Odpowiedz Nowy wątek
2015-01-11 21:07
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?

Pozostało 580 znaków

2015-01-11 21:18
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-11 21:20
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.

Pozostało 580 znaków

2015-01-11 21:28
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);

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-11 21:42
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.

Pozostało 580 znaków

2015-01-11 21:56
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-11 21:59
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?

Pozostało 580 znaków

2015-01-11 22:02
0

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


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-11 22:14
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ć ;)

Pozostało 580 znaków

2015-01-11 22:14

tak.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2015-01-11 22:26
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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