此代码必须加密所有小写字母,并且如果输入内容不是小写字母,则显示错误消息。如果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]);
}
}
答案 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;
您的键取决于原始输入字符串的字符串长度,因此,如果插入空格,则会更改字符串的长度,因此键也会改变。最好先询问键值,或将其作为参数传递。不要使事情过于复杂。