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

question-closed string subscript out of range - szyfr Cezara - C++

Object Storage Arubacloud
0 głosów
539 wizyt
pytanie zadane 17 sierpnia 2022 w C i C++ przez ivankov Nowicjusz (140 p.)
zamknięte 19 sierpnia 2022 przez ivankov

Piszę program szyfrujący plik txt za pomocą szyfru Cezara. Przy próbnym załączeniu dla indeksu = 1 pojawia mi się błąd "string subscript out of range" przy linii którą oznaczyłem w kodzie. Czy mógłby ktoś spojrzeć gdzie mógłby być błąd?

void szyfr_cezara(fstream& in, fstream& out, int klucz)      //implementacja szyfru Cezara
{
    string linia_input;   //tu bedziemy przechowywac poszczegolna linie tekstu z pliku wejsciowego
    string linia_output;    //jw. z pliku wyjsciowego

    while (getline(in, linia_input))    //czytamy plik wejsciowy linia po linii
    {
        for (int i = 0; i < linia_input.length(); i++)   //czytamy kazda litere z wczytanej linii i szyfrujemy
        {
            char znak = linia_input[i];
            if (czy_litera(znak))     //sprawdzamy czy wczytany znak jest litera
            {
                if (islower(znak))   //sprawdzamy czy wczytana litera jest mala
                    linia_output[i] = (znak + klucz) % 26;    // <- tu jest error
                else
                {
                    litera = tolower(znak);
                    linia_output[i] = (znak + klucz) % 26;
                    linia_output[i] = toupper(linia_output[i]);
                }
            }
            else continue;
            cout << linia_output;
        }

        out << linia_output << "\n";    //zapisujemy zaszyfrowana linie do pliku wyjsciowego
    }

}

 

komentarz zamknięcia: otrzymano odpowiedz
komentarz 19 sierpnia 2022 przez Arkadiusz Waluk Ekspert (287,950 p.)
Nie usuwaj treści wpisu, nie wolno tego robić, bo pozostają puste wątki w których są jakieś odpowiedzi i rozmowa, ale zupełnie nie wiadomo o co chodzi. Zapytałeś o coś, otrzymałeś odpowiedź (czasem jest ona mniej a czasem bardziej trafna czy rozwiązująca dany problem), a więc ktoś poświęcił swój czas, aby chociaż spróbować pomóc. Skoro już ktoś to zrobił to warto, aby opis problemu i sposób rozwiązania pozostały. Dzięki temu osoby mające podobny problem w przyszłości będą mogły od razu znaleźć tu rozwiązanie, a nie wyrwaną z kontekstu rozmowę.

Właśnie dlatego usuwanie wszystkiego o co się zapytało zaraz po otrzymaniu pomocy przeczy idei forum i nie można tego robić. Rozumiemy, że czasem są sytuacje wyjątkowe, gdy dane pytanie może być problematyczne, ale w takiej sytuacji należy je edytować tak, aby usunąć problematyczny fragment wypowiedzi czy kawałek kodu, a nadal pozostawić pełny sens umożliwiający zrozumienie o co chodzi. W szczególnych przypadkach, gdy to rzeczywiście konieczne i nic innego nie da się zrobić, można poprosić nas o usunięcie całego tematu, ale nie traktujemy tego jako zwyczaj.

1 odpowiedź

+1 głos
odpowiedź 17 sierpnia 2022 przez j23 Mędrzec (194,920 p.)

linia_output jest pusty, a operujesz na nim, jakby było w nim miejsce na wartości, które wpisujesz.

Użyj operatora +=, aby dodać nową literę na koniec.

komentarz 17 sierpnia 2022 przez ivankov Nowicjusz (140 p.)
sprawdziłem, i program rzeczywiście zaczął działać w tym sensie, że się nie wysypuje, natomiast do pliku i w konsoli zamiast poprawnie zaszyfrowanego tekstu zaczęły mi się wypisywać śmieciowe znaki typu trefl, nuty, etc. gdzie tu jest błąd?
komentarz 17 sierpnia 2022 przez j23 Mędrzec (194,920 p.)
Zapewne tam, gdzie wykonujesz operacje modulo. Powinieneś ją robić nie dla kodów znaków, a dla ich pozycji w alfabecie.
komentarz 17 sierpnia 2022 przez tangarr Mędrzec (154,860 p.)
1. Jaki zakres wartości otrzymasz wykonując działanie X%26?
2. Jaki zakres mają litery w systemie ASCII?
Te dwa pytania powinny naprowadzić cię na rozwiązanie.
komentarz 18 sierpnia 2022 przez ivankov Nowicjusz (140 p.)

@j23, @tangarr, trochę się z tym pobawiłem i rzeczywiście pomogło, natomiast teraz mam problem z tym że do wyjściowego pliku zapisywana jest w jednej linii nie tylko linia która była w oryginalnym pliku, ale i wszystkie poprzednie, domyślam się że tutaj trzeba użyć out.ignore(), ale nie wiem zbytnio w którym miejscu  

komentarz 18 sierpnia 2022 przez j23 Mędrzec (194,920 p.)

Po linii 26 wstaw linia_output.clear();

Podobne pytania

0 głosów
0 odpowiedzi 547 wizyt
0 głosów
1 odpowiedź 289 wizyt
pytanie zadane 14 września 2023 w Bezpieczeństwo, hacking przez Dawidpl Nowicjusz (210 p.)
0 głosów
2 odpowiedzi 131 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...