C中凯撒密码中的空格

时间:2018-12-05 11:22:02

标签: c caesar-cipher

此代码必须加密所有小写字母,并且如果输入内容不是小写字母,则显示错误消息。如果Key为零,则输入将取反。

效果很好,但是当涉及到空间时,事情就出了错。

必须出现的内容:

plain text: notverysecure thiscaeserwas

encrypted text: jkpranuoayqna pdeoywaoanswo

出现的内容:

plain text: notverysecure thiscaeserwas

encrypted text: abgirelfrpher guvfpnrfrejnf

但是,如果输入是:

plain text: notverysecurethiscaeserwas

encrypted text: jkpranuoayqnapdeoywaoanswo

我的猜测是Key的计算中涉及到空格,但是我试图解决此问题却无济于事。

我的问题是如何使代码读取输入中的空格,而又不让它们参与任何形式的操作

代码:

#include <stdio.h>
#include <string.h>
#include <ctype.h>
//*******************************************************************
// Function to reverse the input string
void rev (const char *const c)
{
if (*c)
{

  rev (c + 1);
  putchar (*c);

 }
}
//*******************************************************************

int main (void)
{
char string[350];
int Key;

printf ("plain text: ");
fgets (string, sizeof (string), stdin);
Key = 256 % (strlen (string) - 1);
//***************************************************************
//ERROR CHECK

if (strlen (string) > 256)
 {
  printf ("[ERR] too many characters\n");
  return -1;
}


for (int counter = 0; string[counter] != '\n'; counter++)
{

  if ( !(islower (string[counter])) && string[counter] != ' ')
{
  printf ("[ERR] invalid characters\n");
  return -2;
}

//**************************************************************

int difference = 0, shift = 0;
for (int counter = 0; string[counter] != '\0'; counter++)
{

  if (string[counter] >= 'a' && string[counter] <= 'z') 
{


  difference = 'z' - string[counter];

  if (Key > difference)
    {
      shift = Key - (difference + 1);
      string[counter] = 'a';
      string[counter] += shift;
    }
  else
    {
      string[counter] += Key;
    }
}
}
printf ("encrypted text: ");

if (Key == 0)
{
      string[strlen(string) - 1] = '\0';
      string[-1] = '\n';
  rev (string);

  return 0;
}
for (int counter = 0; string[counter] != '\0'; counter++)
{
  printf ("%c", string[counter]);
}
}

2 个答案:

答案 0 :(得分:1)

在这种情况下,您必须在计算密钥时手动检查空格

int stringLength = 0;

for(int i=0;i<strlen (string);i++){
    if(string[i]!=' '){
        stringLength++;
    }
}

Key = 256 % (stringLength - 1);

答案 1 :(得分:0)

当然,正如您编写的代码一样,key的计算取决于原始字符串长度(Key = 256 % (strlen (string) - 1);)的函数,与此有关的两件事:

  • Caesar密码将密钥添加到每个加密的字符mod alphabet_size中,因此,如果您对字母进行加密,则总会得到一个字母。这意味着键应该在[0..alphabet_size-1]中(这不是必需的,但是将键添加到输入字符,因此在这里要小心)。在您的情况下,alphabet_size是26,因此更好:

    Key = some_value_input_from_the_user % alphabet_size;
    
  • 您的键取决于原始输入字符串的字符串长度,因此,如果插入空格,则会更改字符串的长度,因此键也会改变。最好先询问键值,或将其作为参数传递。不要使事情过于复杂。