Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-加解密中的凯撒密码_C_Encryption_Caesar Cipher - Fatal编程技术网

C-加解密中的凯撒密码

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;

我做了这个程序,但似乎不起作用,你能告诉我为什么吗?我花了大约3个小时才弄明白它为什么不起作用,但我不知道。我想知道是不是轮班的原因,但我不确定。这是我的第一个节目,我对一些基本的错误感到非常抱歉

#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;
}