C-加解密中的凯撒密码
我做了这个程序,但似乎不起作用,你能告诉我为什么吗?我花了大约3个小时才弄明白它为什么不起作用,但我不知道。我想知道是不是轮班的原因,但我不确定。这是我的第一个节目,我对一些基本的错误感到非常抱歉C-加解密中的凯撒密码,c,encryption,caesar-cipher,C,Encryption,Caesar Cipher,我做了这个程序,但似乎不起作用,你能告诉我为什么吗?我花了大约3个小时才弄明白它为什么不起作用,但我不知道。我想知道是不是轮班的原因,但我不确定。这是我的第一个节目,我对一些基本的错误感到非常抱歉 #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { char message[100]; int shift; int i; int choice;
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
char message[100];
int shift;
int i;
int choice;
printf("Enter operation with message\n");
printf("encrypt - 1\n");
printf("decrypt - 2\n");
scanf("%d", &choice);
switch(choice)
{
case 1:
{
printf("Enter message to encrypt\n");
scanf("%d", &message);
printf("Enter shift\n");
scanf("%d", &shift);
for (i = 0; message[i] != '\0'; i++)
{
message[i] = message[i] + shift;
if (message[i] > 'z')
message[i] = message[i] - 26;
}
printf("Encrypted message: %s\n", message);
break;
}
case 2:
{
printf("Enter message to decrypt\n");
scanf("%d", &message);
printf("Enter shift\n");
scanf("%d", &shift);
for (i = 0; message[i] != '\0'; i++)
{
message[i] = message[i] - shift;
if (message[i] > 'z')
message[i] = message[i] - 26;
}
printf("Decrypted message: %s\n", message);
break;
}
}
return (EXIT_SUCCESS);
}
#包括
#包括
int main(int argc,字符**argv){
字符消息[100];
int移位;
int i;
智力选择;
printf(“使用消息输入操作\n”);
printf(“加密-1\n”);
printf(“解密-2\n”);
scanf(“%d”,选择(&C);
开关(选择)
{
案例1:
{
printf(“输入要加密的消息\n”);
scanf(“%d”和消息);
printf(“输入shift\n”);
scanf(“%d”和shift);
对于(i=0;消息[i]!='\0';i++)
{
消息[i]=消息[i]+移位;
如果(消息[i]>z')
消息[i]=消息[i]-26;
}
printf(“加密消息:%s\n”,消息);
打破
}
案例2:
{
printf(“输入要解密的消息\n”);
scanf(“%d”和消息);
printf(“输入shift\n”);
scanf(“%d”和shift);
对于(i=0;消息[i]!='\0';i++)
{
消息[i]=消息[i]-移位;
如果(消息[i]>z')
消息[i]=消息[i]-26;
}
printf(“解密消息:%s\n”,消息);
打破
}
}
返回(退出成功);
}
这里是一个输出屏幕:
始终注意编译器警告。如果我编译您的代码,我会收到以下警告(以及更多警告): 主要有两个问题: 1。格式说明符有误: 阅读有关不同格式说明符的信息。
在您使用的代码中:
char message[100];
scanf("%d", &message);
但是对于C字符串(char*
),它应该是%s
,而不是用于int
的%d
。最好使用%99s
来避免错误。此外,它应该是没有符号(&
)的消息
,因为指向字符*
但消息
将是指向数组的指针:字符(*)[100]
。这将导致警告,因为%s
需要char*
char message[100];
if (1 != scanf("%99s", message)) /* buffer size - 1 */
return EXIT_FAILURE;
此外,scanf()
返回成功读取的元素数。我建议始终检查指示错误的返回值
2。解密时出现逻辑错误:
在减去shift
值时,它必须是message[i]
,而不是选中message[i]>'z'
。在这种情况下,再加上26,而不是减去它
for (i = 0; message[i] != '\0'; i++)
{
message[i] = message[i] - shift;
if (message[i] < 'a')
message[i] = message[i] + 26;
}
(i=0;消息[i]!='\0';i++)的
{
消息[i]=消息[i]-移位;
如果(信息[i]<'a')
消息[i]=消息[i]+26;
}
编辑#1: 您键入的消息还有另一个逻辑问题。您的代码仅适用于由小写字母组成的邮件。您可以将其扩展为使用大写字母 此外,您的缓冲区可能会保存声明为
char message[100]的signed char
s1代码>,这意味着如果计算:消息[i]=消息[i]+移位代码>。例如,如果使用字符z
(十进制122 in)和shift
的6,这将导致128,但有符号字符最多只能容纳127
1我写了“可以保留签名字符
s”,因为C标准将其留给实现,但是对于GCC和MSVC,字符
默认情况下将是签名字符。“似乎不起作用,你能告诉我为什么吗?”我们不能,因为你没有告诉我们它是如何起作用的。请参阅和。switch语句中的case必须用大括号括起来,如case1{…}
一个“基本错误”是在不知道如何使用调试器的情况下尝试开发程序:(@campovski不是大小写-大括号是可选的。大小写的结尾由开关的中断
或关闭大括号定义。如果我编译此代码,我会收到许多警告,例如:scanf()的格式说明符错误)
:警告:格式“%d”要求参数类型为“int*”,但参数2的类型为“char(*)[100]”[-Wformat=]
等。您应该注意它们!此行将非常失败:scanf(“%d”,&message);
!下面的评论中提到了关于解密的逻辑错误。@爆米花:我在回答中添加了更多的注意事项。请看一下。我检查过了,非常感谢,现在我的代码运行得很好,非常感谢!-)我将尝试添加Vigenere密码,所以如果我遇到一些问题,我将在这里显示:):p
for (i = 0; message[i] != '\0'; i++)
{
message[i] = message[i] - shift;
if (message[i] < 'a')
message[i] = message[i] + 26;
}