2

インターネットでたくさんの例を見つけましたが、トルコ語のアルファベットのシーザー暗号の復号化は見つかりませんでした。ほとんどの文字は英語のアルファベットに似ていますが、いくつかの違いがあります。トルコ語のアルファベットは次のとおりです。

A B C Ç D E F G Ğ H I İ J K L M N O Ö P R S Ş T U Ü V Y Z

a b c ç d e f g ğ h i ı j k l m n o ö p r s ş t u ü v y z

私は英語のアルファベットのこのコードを見つけましたが、İ、Ö、Ü、Ş、ç、ğ、ı、ö、ş、üのような文字がありません:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;

int main()
{
    char code[501];
    int shift, len, i=0, j=0;

    cout << "Caesar Cipher Decoder " << endl;
    cout << "\nThis program will decrypt the entered text using Caesar Cipher." << endl;
    cout << "\nPress any key to continue...";
    _getch();

    system("cls");
    cout << "Enter the text that has to be decrypted (max 500 characters):" << endl;
    cin.getline(code, 501);
    len = strlen(code);

    while (j < len)
    {
        if(code[j] == 32)
        {
            code[j] = code[j];
        }

        j++;
    }

    po:
    cout << "\nEnter the amount of Caseser Shift in numbers: ";
    cin >> shift;
    if ((shift > 26) || (shift < 0))
    {
        cout << "\nShift value should be less than or equal to 26. Type again." << endl;
        goto po;
    }

    while (i < len)
    {

        code[i] = tolower(code[i]);
        code[i] = code[i] - shift;

        if (code[i] + shift == 32)
        {
            code[i] = code[i] + shift;
        }

        else if(
                ((code[i] + shift > 31) && (code[i] + shift < 65)
                || ((code[i] + shift > 90) && (code[i] + shift < 97))
                || ((code[i] + shift > 122) && (code[i] + shift < 128)))
                )
                {
                    code[i] = code[i] + shift;
                }

        else if (code[i] < 97)
        {
            if (code[i] == 32 - shift)
            {
                code[i] = code[i] + shift;
            }
            else
            {
                code[i] = (code[i] + 26);
            }
        }
        i++;
    }
    system("cls");
    cout << "\nYour deciphered code is: \"" << code << "\"" << endl;

    cout << "\nYour text has been decrypted." << endl;
    cout << "\nPress any key to end." << endl;
    _getch();

    return 0;
}

トルコ語のアルファベットでこれを機能させるのを手伝ってください。

4

1 に答える 1

4

あなたが投稿したそのサンプルコードは、標準のラテンアルファベットがASCIIテーブルの連続したブロックであるという事実に依存しています。トルコ語のアルファベットはそうではないので、別の方法で問題に取り組む必要があります。

置換テーブルを使用することをお勧めします。256文字の配列(文字エンコードテーブルの各コードポイントに1つ)を作成し、各コードポイントに代わりに使用されるはずの文字を入力します。次に、入力テキストを繰り返し、その配列で検索して各文字を置き換えます。

于 2013-03-21T13:32:51.583 に答える