Шифр Виженера(не работает)

158
29 марта 2019, 20:50

решил сделать сам Шифратор/Дешифратор Виженера, но столкнулся с какой-то не понятной проблемой:

// Шифратор и дешифратор шифра Виженера.
#include<iostream>
#include<iomanip>
#include<string>
#define e endl
using namespace std;
int main(){
    setlocale(LC_ALL, "Russian");
    string x, y, z;
    int a, b, c;    
    cin >> x;
    cin >> y;
    short int r = 33;
    string alf = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
    int d = 0;
    for( int i = 0 ; i < x.size() ; i++ )
    {
        // cout << 124;
        if( d > y.size()) 
        {
            d = 0;
        }
        //cout << 124;
        b = 0;
        while( x[i] != alf[b] )
        {
            b++;
        }
        // cout << 124;
        c = 0;
        while( y[d] != alf[c] )
        {
            c++;
        }
        //cout << 124;
        a = b + c;
        if( a > r )
        {
            a = a - r;          
        }
        //cout << 124;
        z += alf[a];
        //cout << 124;
        d++;
        //cout << 124;
    }
    cout << z;
    return 0;
}

После ввода двух слов( x - слово которое шифруется, y - ключ шифрования ) у меня крашится программа. После того как я посмотрел после какого действия у меня не выводит "124", я понял, что это после этого фрагмента:

c = 0;
    while( y[d] != alf[c] )
    {
        c++;
    }

Не вижу ничего такого, что могло поломать программу, может быть вы увидите. p.s. Если не сложно, можете кинуть наработки по абсолютно любым шифраторам/дешифраторам на C++, буду благодарен... UPD: Проблема не в этом цикле, а чём то другом...

Answer 1

Проблема решается, если консоли явно указать кодировку для ввода символов SetConsoleCP(1251);. Но это не отменяет необходимость проверять входные данные и проверять счетчики b и c на допустимость значений.

// Шифратор и дешифратор шифра Виженера.
#include<iostream>
#include<iomanip>
#include<string>
#include <windows.h>
#define e endl
using namespace std;
int main(){
    SetConsoleCP(1251);     
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
    string x, y, z;
    int a, b, c;    
    cin >> x;
    cin >> y;
    // на всякий случай проверяем значения:
    cout << "x = " << x << "\n";
    cout << "y = " << y << "\n";
    short int r = 33;
    string alf = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
    int d = 0;
    for( int i = 0 ; i < x.size() ; i++ )
    {
        // cout << 124;
        if( d > y.size()) 
        {
            d = 0;
        }
        //cout << 124;
        b = 0;
        while( x[i] != alf[b] )
        {
            b++;
        }
        // cout << 124;
        c = 0;
        while( y[d] != alf[c] )
        {
            c++;
        }
        //cout << 124;
        // на всякий случай проверяем значения:
        cout << "b = " << b << "\n";
        cout << "c = " << c << "\n";
        a = b + c;
        if( a > r )
        {
            a = a - r;          
        }
        //cout << 124;
        z += alf[a];
        //cout << 124;
        d++;
        //cout << 124;
    }
    cout << z;
    return 0;
}
READ ALSO
Исходный код Yandex speller

Исходный код Yandex speller

Где я могу найти исходный код Yandex speller, обыскал весь интернет, но не нашел, еще один вопрос есть ли yandex speller в качестве библиотеки для java?

173
Java, парсинг строки

Java, парсинг строки

Есть строка типа HaT523HaT524HaT525Подскажите, пожалуйста, как можно разбить эту строку так:

191
Caused by: java.lang.ArrayIndexOutOfBoundsException: 15 в простом случае

Caused by: java.lang.ArrayIndexOutOfBoundsException: 15 в простом случае

В чем ошибка-то? Он возмущается на строчки

212
LinkedHashSet не удаляет повторяющиеся элементы

LinkedHashSet не удаляет повторяющиеся элементы

Проблема в следующем: необходимо удалить повторяющиеся элементы ArrayList'аДля этого использую следующий код:

144