如何从用户那里获取字母表

Posted

技术标签:

【中文标题】如何从用户那里获取字母表【英文标题】:How do I get alphabet from the user 【发布时间】:2018-12-14 21:01:23 【问题描述】:

我有这个问题。我为“vigenere cipher”编写了一个代码。

我有文字和钥匙。但我想从用户那里得到字母表。用户想要什么等:“abcdfgh”或“sdgfjdgkfdsgs”正是用户想要的。

所以,但我做不到。

如何从用户那里获得字母表?

首先,我想从用户那里获取字母表。 之后,我希望它输入单词并对其进行加密。但是字母表是用户的字母表。

Here is the codes:
 #include <iostream>
 #include <string>
 using namespace std;

 // Bu fonksiyon bir key oluşturur.
  string generateKey(string str, string key) 
 
 int x = str.size();

 for (int i = 0; ; i++)
  
      if (x == i)
        i = 0;
      if (key.size() == str.size()) // eğer oluşturulan key boyutu girilen 
    metnin boyutuna eşitse fonksiyonu durdur.
        break;
    key.push_back(key[i]);

return key;
    
    string cipherText(string str, string key) // "/Bu fonksiyon orjinal metni şifreler \"
      
    string cipher_text;

   for (int i = 0; i < str.size(); i++)
  
    // converting in range 0-25 
    int x = (str[i] + key[i]) % 26;

    // alfabeyi ASCII kodlarina dönüştür:
    x += 'A';

    cipher_text.push_back(x);
 
       return cipher_text;
  

    //  "/Bu fonksiyon şifreli metni orjinal hale getirir\"

      string originalText(string cipher_text, string key)
    
string orig_text;

for (int i = 0; i < cipher_text.size(); i++)

    // converting in range 0-25 
    int x = (cipher_text[i] - key[i] + 26) % 26;

    // convert into alphabets(ASCII) 
    x += 'A';
    orig_text.push_back(x);

return orig_text;
       
        int main()
          
cout << " Sifrelenmesini istediginiz kelimeyi/cumleyi giriniz" << endl;
string str;
getline(cin, str);

//string str = "METINBUGRA";
cout << "Anahtar kelimeyi giriniz." << endl;
string keyword;
getline(cin, keyword);
//string keyword = "ABC";

string key = generateKey(str, keyword);
string cipher_text = cipherText(str, key);

cout << "Sifrelenmis Kelime : "
    << cipher_text << "\n";

cout << "Cozumlenmis kelime : "
    << originalText(cipher_text, key);
system("pause");
return 0;
   

【问题讨论】:

【参考方案1】:

如果我正确理解了您的问题,您想使用自定义字母而不是英文字母。例如,您可以添加数字。

    您必须对数字进行运算,而不是实际字母:0, 1, 2, ... N-1,其中N 是字母的大小。对于英文字母,这意味着您必须使用0 而不是A (0x41)、1 而不是B (0x42)、... 25 而不是Z

    如果密钥大小为M,则i位置处字母的加密算法为:

    ( L[i] + K[i mod M] ) mod N

    一旦您有了对数字进行运算的函数式算法,您所要做的就是将输入从字母映射到数字,然后将输出从数字映射到字母

    将数字映射到字母很容易;您只需要将字母表存储到一个字符串中 - 这回答了您的问题

    string n_to_letter; // alphabet
    //...
    int main()
    
      //...
      cin >> n_to_letter; // read the alphabet
      //...
    

    将字母映射到数字可能超出您目前的知识范围;您必须使用 map:

    #include <map>
    //...
    string n_to_letter; // alphabet
    map< char, int > letter_to_n;
    
    void init_letter_to_n() //...
    

    如果您不知道如何使用地图,有一个解决方法:只需搜索字母字符串中的字母,或使用 256 个字符的向量/字符串。

DEMO

【讨论】:

以上是关于如何从用户那里获取字母表的主要内容,如果未能解决你的问题,请参考以下文章

如何从用户那里获取多行输入[重复]

torrent 用户如何从其他用户那里获取大量数据?

如何使用密码生成器的 if 语句从用户获取点击功能的价值?

如何通过 ContactsContracts API 从用户那里获取 facebook id?

当他单击添加按钮时,我如何从用户那里获取数据?

如何从用户那里获取信息而不是使用特定值?