密码适用于较低部分但不适用于上部分。例如,如果我提供3的密钥并输入I like pie!!
进行加密,我会O olnh slh!!
我也尝试HELLO
并获得NKRRU
。 isupper部分也返回标点而不仅仅是字母。我还没弄清楚为什么原始邮件被改变以匹配密码消息。
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main (int argc, string argv[])
{
/*
Get key from user at command line
Get plaintext from user
Use key to encipher text: c[i] = (p[i] + k)%26
Print ciphered message
*/
string message, cipher;
int key;
// command line, if user doesn't enter 2 arguments return 1 and request a valid
//encryption key and rerun.
if (argc != 2)
{
printf("Please enter a valid encryption key and rerun program.\n");
return 1;
}
else
{
key = atoi(argv[1]);
}
printf("Enter the message you wish to encrypt.\n");
message = GetString();
cipher = message;
int length = strlen(message);
for ( int i = 0; i < length; i++)
{
if (isalpha(message[i]))
{
if (isupper(message[i]))
{
cipher[i] = (message[i] - 'A' + key) % 26 + 'A';
}
else (islower(message[i]));
{
cipher[i] = (message[i] - 'a' + key) % 26 + 'a';
}
}
else continue; //message[i] contains punctuation or a space
}
printf("Your original message was..\n");
printf("%s\n", message);
printf("The encrypted message is...\n");
printf("%s\n", cipher);
return 0;
}
答案 0 :(得分:3)
每个@interjay错误地丢失if
。
更改
else (islower(message[i]));
到
// v
else if (islower(message[i]))
// or simply
else // Since `message[]` is an alpha, but not upper
出现错误时,如果文字为大写,则cipher[i] = (message[i] - 'A' ...
和cipher[i] = (message[i] - 'a' ...
都会发生。给定cipher = message
,密码应用了两次。
@keshlam关于丢失缓冲区的观点是一个重要问题。但我想知道string
是什么类型。这是某种C ++ lite字符串吗?如果是char *
,则代码可以使用cipher = strdup(message);
或
cipher = malloc(length + 1);
if (cipher === NULL) Handle_OutOfMemeory();
cipher[length] = '\0';
for ( int i = 0; i < length; i++)
...
答案 1 :(得分:2)
你正在覆盖消息,因为你说 密码=消息; 这意味着现在都指向同一块内存。分配一个新的输出缓冲区。
还有两点向Chux发现了多余的分号。