C中凯撒密码中的空格

Spaces in caesar cipher in C

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

它运行良好,但是当涉及到 space 时,事情就出错了。

必须出现的内容:

plain text: notverysecure thiscaeserwas

encrypted text: jkpranuoayqna pdeoywaoanswo

出现的内容:

plain text: notverysecure thiscaeserwas

encrypted text: abgirelfrpher guvfpnrfrejnf

但是如果输入是:

plain text: notverysecurethiscaeserwas

encrypted text: jkpranuoayqnapdeoywaoanswo

我的猜测是 space 参与了 Key 的计算,但我试图解决这个问题却无济于事。

我的问题是如何让代码读取输入中的 spaces,但又不让它们参与任何类型的操作

代码:

#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] != '[=13=]'; 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] = '[=13=]';
      string[-1] = '\n';
  rev (string);

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

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

int stringLength = 0;

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

Key = 256 % (stringLength - 1);

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

  • 凯撒密码将密钥添加到每个加密的字符 mod alphabet_size,所以如果你加密字母,你总是会得到一个字母。这意味着Key应该在[0..alphabet_size-1](这不是要求,但是将key添加到输入字符,所以这里要小心)。在你的情况下 alphabet_size 是 26,所以更好:

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