2012-06-17 3 views
1

Используя C++, я пытаюсь написать программу, которая шифрует строку. Я должен сопоставить каждую букву алфавита с числовым значением: например, a = 0, b = 1, c = 2 и т. Д. До сих пор я создал функцию void, которая берет строку в качестве параметра и использует оператор switch для вывода значений. Проблема в том, что значения - это символы, а не ints, и я не могу использовать математические операторы для их изменения. Моего исходный код ниже:Сопоставление числовых значений с символами

#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.

ответ

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(); 
0

Символов в C/C++ имеют числовые значения, формат ASCII, 'А' 65, 'В' 66 ... 'а' 97, 'B' 98 и так далее, как таковые вы можете применить математические операторы на них, это может быть проще просто придерживаться хорошо известного формата ASCII, вместо того чтобы создавать свои собственные, http://en.wikipedia.org/wiki/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 

простой/наивным шифрования схемой было бы просто сдвинуть символы b y определенная сумма (shift cypher), хотя при работе с схемами шифрования вы всегда должны быть осторожны с переполнениями, в зависимости от схемы, которую вы реализуете.

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 

, чтобы получить обратно оригинал просто вычесть смещение.

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; 
} 

Выход:
Оригинал: Здравствуйте
Encrypt: Ут]]
Расшифровать: Здравствуйте