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

Szyfr cezara na tablicach charów jak najbardziej ale stringi to się buntują.

Object Storage Arubacloud
0 głosów
756 wizyt
pytanie zadane 23 maja 2016 w C i C++ przez Ozzy Nowicjusz (140 p.)

Dzień dobry, witam serdecznie. Napisałem sobie ostatnio (w związku z maturą z informatyki) funkcję szyfrującą za pomocą szyfru cezara. Napisałem ją na tablicach charów o jakoś tak: 

void cezar(int key, char word[])
{
    int len = strlen(word);
    key=key%26;
    if (key>=0)
    {
        for (int i=0;i<len;i++)
        {
            if (word[i] + key <= 'Z')
            {
                word[i]+=key;
            }
            else
            {
                word[i]=word[i]+key-26;
            }
        }
    }
    else
        for (int i=0;i<len;i++)
        {
            if (word[i] + key >= 'A')
            {
                word[i]+=key;
            }
            else
            {
                word[i]=word[i]+key+26;
            }
        }
}

i wszystko śmiga wszystko gra a nawet buczy. Ale kiedy doszedłem do wniosku, że musiałbym stworzyć tutaj w mainie tablice charów o określonej ilości znaków to pomyślałem sobie "a co gdyby użyć stringów?". I stworzyłem takie coś:

void cezar(int key, string word)
{
    int len = word.length();
    key=key%26;

    for(int i=0; i<len;i++)
    {
        if (key + word[i] > 90)
        word[i]= (word[i] + key) - 26;

        else if (key + word[i] < 65)
        word[i]= (word[i] + key) + 26;

        else
        word[i]= word [i] + key;

    }
}

niestety ten kod jest już lekko niesforny i nie chce się słuchać kompilatora. Po wpisaniu parametrów klucza i stringa ze słowem do zaszyfrowania słowo w ogóle się nie szyfruje. Program po wrzuceniu na ekran "zaszyfrowanego" już stringa, wyrzuca go w postaci wejściowej. Moje pytanie brzmi co zrobiłem źle? Czy ze stringami nie mogę postępować jak z tablicami charów?

edit. Oczywiście dołączyłem odpowiednie biblioteki do obydwu funkcji.

1 odpowiedź

+2 głosów
odpowiedź 23 maja 2016 przez baszmest Gaduła (3,080 p.)

Przekazując tablicę charów do funkcji tak naprawdę przekazujesz wskaźnik na pierwszy element. Przekazując wskaźnik sprawiasz, że modyfikowane są oryginalne dane ( w tym przypadku słowo będące ciągiem znaków). Dlatego po wykonaniu funkcji dla charów wszystko "gra, śmiga a nawet buczy ".
Jednak gdy argumentem funkcji jest string, to przekazujesz jedynie jego "kopię" - to znaczy, że string który jest modyfikowany przez funkcję nie jest stringiem, który chciałeś przekazać (ponieważ zajmuje inne miejsce w pamięci) . Skutkiem tego, oryginalny string jest nieruszony. Aby to zmienić musisz użyć referencji - tu masz opisane: http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Przekazywanie-argumentow-funkcji-przez-referencje/356

Pozdrawiam :)

PS. Nie wiem, czy nie namieszałem za bardzo :)

komentarz 24 maja 2016 przez szmyt151 Bywalec (2,010 p.)
albo dodac inna zmienna i ja wypisywac :)
komentarz 25 maja 2016 przez baszmest Gaduła (3,080 p.)

Masz na myśli wypisywanie zmiennej wewnątrz funkcji czy zwracanie  przez funkcje stringa do jakiejś zmiennej ?

Podobne pytania

0 głosów
0 odpowiedzi 389 wizyt
+1 głos
1 odpowiedź 525 wizyt
pytanie zadane 12 czerwca 2016 w C i C++ przez Szejk Obywatel (1,510 p.)
0 głosów
1 odpowiedź 1,438 wizyt
pytanie zadane 5 maja 2016 w C i C++ przez Linker Bywalec (2,690 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...