1

C ++を使用して、文字列を暗号化するプログラムを作成しようとしています。アルファベットの各文字を数値にマップする必要があります。たとえば、a = 0、b = 1、c=2などです。これまで、文字列をパラメーターとして受け取り、switchステートメントを使用して値を出力するvoid関数を作成しました。問題は、値がintではなくcharであり、数学演算子を使用して値を変更できないことです。私のソースコードは以下の通りです:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
#include <cctype>

using namespace std;

void mapped_string(string in)
{   string mapped_string;
    int length = in.length();

    for (int i = 0; i < length; i++)
    {   
        switch (in[i])
        {
        case 'a':
            cout<<"0";
            break;
        case 'b':
            cout<<"1";
            break;
        case 'c':
            cout<<"2";
            break;
        case 'd':
            cout<<"3";
            break;
        case 'e':
            cout<<"4";
            break;
        case 'f':
            cout<<"5";
            break;
        case 'g':
            cout<<"6";
            break;
        case 'h':
            cout<<"7";
            break;
        case 'i':
            cout<<"8";
            break;
        case 'j':
            cout<<"9";
            break;
        case 'k':
            cout<<"10";
            break;
        case 'l':
            cout<<"11";
            break;
        case 'm':
            cout<<"12";
            break;
        case 'n':
            cout<<"13";
            break;
        case 'o':
            cout<<"14";
            break;
        case 'p':
            cout<<"15";
            break;
        case 'q':
            cout<<"16";
            break;
        case 'r':
            cout<<"17";
            break;
        case 's':
            cout<<"18";
            break;
        case 't':
            cout<<"19";
            break;

        default:
            cout<< in[i];
        }
    }
}

int main()
{   string str1 = "Hello";

    mapped_string(str1);



        cout    << "Press any key to exit." << endl;
        cin.ignore(2);
        return 0;
}

文字列内の各文字をint値にマップし、int値をmapped_stringという新しい文字列に格納するには、この関数が必要です。

4

3 に答える 3

0

C / C ++の文字には数値、ASCII形式、「A」は65、「B」は66 ...「a」は97、「b」は98などがあり、数学演算子を適用できます。 、独自のhttp://en.wikipedia.org/wiki/ASCIIを作成するよりも、よく知られているASCII形式に固執する方が簡単な場合があります。

string str1 = "Hello";
for (int index = 0; index < str1.length(); index++)
    cout << "char: " << str1[index] << " ascii numeric values: " << (int)(str1[index]) << endl;

プリント:

char: H ascii numeric values: 72
char: e ascii numeric values: 101
char: l ascii numeric values: 108
char: l ascii numeric values: 108
char: o ascii numeric values: 111

単純で単純な暗号化スキームは、文字を特定の量だけシフトすることです(シフト暗号)。ただし、暗号化スキームを使用する場合は、実装しているスキームに応じて、常にオーバーフローに注意する必要があります。

  string str1 = "Hello", cipher = "";    
  for (int index = 0; index < str1.length(); index++)
      cipher += (char)(str1[index] + 10);
  cout << "original: " << str1 << " cipher " << cipher << endl;

プリント:

 original: Hello cipher Rovvy 

元に戻すには、オフセットを差し引くだけです。

于 2012-06-17T21:08:02.773 に答える
0

C++11 の使用:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

string mapped_string(string in, char password)
{
    transform(in.begin(), in.end(), in.begin(), [password](char& x){ return x ^ password; });
    return in;
}

int main(int argc, char* argv[])
{
    char password = '1';
    string str1 = "Hello";
    string str2 = mapped_string(str1, password); // encrypt str1
    string str3 = mapped_string(str2, password); // decrypt str2
    cout << "Original: " << str1 << endl;
    cout << "Encrypt:  " << str2 << endl;
    cout << "Decrypt:  " << str3 << endl;
    cin.ignore();
    return 0;
}

出力:
オリジナル: Hello
暗号化: yT]]復号化
: Hello

于 2012-06-18T06:27:23.473 に答える
0
//stringstream is used as string 'builder'.
std::stringstream storedstr;

for (int i = 0; i < length; i++)
{   
    //As op's code but without the lengthy switch statement. Just cast to get an int.
    int intEquiv = (int)(in[i]);
    if (in[i] > 'z' || in[i] < 'a') intEquiv = (int)(in[i]) - 'a'
    storedstr << intEquiv;

    //Show what we are adding, like in original loop;
    std::stringstream ss;
    ss << intEquiv;
    std::cout << ss.str();
}
mapped_string = storedstr.str();
于 2012-06-17T20:34:37.300 に答える