如果有空格,我如何才能正确加密输入?

时间:2016-04-09 00:24:43

标签: c++ encryption vigenere

#include <iostream>
#include <cstring>
#include <string>
//#include <cctype>
using namespace std;

string k;
int key[1024];
int size = 0;
int count = 0;
char text[1024];
char o;

void encrypt(char input[]);
void decrypt(char input[]);

// get arguments from command line 
int main(int argc, char *argv[])
{
 if(argc >= 3)
    {
      k = argv[2];
      // removing spaces from key 
      // storing key into char array
      for(int i = 0; i < k.length(); i++)
    {
      if(k.at(i) == ' ')
        {
          key[i] = k.at(i+1);
              i++;
        }
      else
        {
          key[i] = k.at(i);
          // cout << key[i] << endl;
        }

      size++;

    }
      if(strcmp(argv[1], "-e") == 0)
    {
      // get text from user
      // encrypt
      cout << "encryption " << endl;
      cin.getline(text, sizeof(text));
      encrypt(text);
    }
      else if(strcmp(argv[1], "-d") == 0)
      {
        // get text from user
        // decrypt
        cout << "decryption " << endl;
        decrypt(text);
      }

    }

}

void encrypt(char input[])
{
  string word = input;
  char wkey[word.length()];
  // cout << word.length();
  for(int i = 0; i < word.length(); count++, i++)
    {
      // if input is larger than the key
      // chars of key will repeat until the size is the length of the input
      if(i > size - 1)
        {
          if(i == size)
        {
          count = 0;
        }
          wkey[i] = wkey[count];
        }
      else
        {
          wkey[i] = key[i];
        }



       // if input is a space, cout a space
      if(input[i] == ' ')
    {      
      cout << " ";

    }
      // if input is something other than a letter, then just print it out
      else if(input[i] < 65 || input[i] > 122 || input[i] > 90 && input[i] < 97)
    {
      cout << input[i];
    }
      else
    {
      // ignoring case of the letters in the key
      // give the letters a range of 0-25
      if(wkey[i] >= 65 && wkey[i] <= 90)
        {
          wkey[i]-= 'A';
        }
      else if(wkey[i] >= 97 && wkey[i] <= 122)
        {
          wkey[i]-= 'a';
        }
      //      cout << wkey[i] << endl;

      // if input is uppercase, put it in the range of 0-25
      // make shift by adding to char in key
      // mod by 26 to wrap around
      // o is the encrypted character that will be printed
      if(input[i] >= 65 && input[i] <= 90)
        {
          o = ((wkey[i] + (input[i] - 'A')) % 26) + 'A';
        }
      else if(input[i] >= 97 && input[i] <= 122)
        {
          o = ((wkey[i] + (input[i] - 'a')) % 26) + 'a';
        }
    }
       cout << o;

    } 
}

问题是,如果文本包含空格,我在加密明文时遇到问题。如果文本只是一个单词,则程序可以正常工作。在我测试空间输入的加密函数中,我只打印出一个空格,然后发生for循环的下一次迭代。我认为这个问题正在发生,因为一旦发生下一次迭代,将跳过与输入中的空间处于相同索引处的键中的字符。我尝试使用if语句回滚到键中跳过的字母,但我仍然得到错误的输出。如果有人能就如何解决这个问题给我一些建议,我会非常感激。

0 个答案:

没有答案