遇健 发表于 2021-11-27 22:44:28

求助

有没有谁帮我看一下我写的代码哪里错了?它可以运行但运行的结果有问题,运行结果看图
在密码学中,恺撒密码是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。向后移动的位数就是密钥,例如,密钥 k=3,则每个字母都会向前移动 3位:a 会被替换为 d;b 会被替换成 e;依此类推。字母表末尾将回卷到字母表开头。于是,w 会被替换为 z,x 会被替换为 a。 请编写程序,要求输入密码和信息,然后京程序加密后输出密文,并设计解密程序对密文进行解密。
#include <stdio.h>
int main()
{
      char P;/*定义明文长度*/
      char C;/*定义密文长度*/
      int K=3,i;
      printf("Please input message:\n"); /*输入明文*/
      gets(P); /* 接受明文*/

      for(i=0;P!='\0';i++)
                {/*逐个判断字母的大小*/
            if(P>='a'&&P<='z') /*小写字母 */
             {
               C=(P-'a'+K)%26+'a';
             }
            else if(P>='A'&&P<='Z')/*大写字母 */
             {
               C=(P-'A'+K)%26+'A';
             }
            else
                               C=' ';/*如果不是字母,转换为空格*/
      }

      printf("The Ciphertext is :\n%s\n",C);/*输出密文*/

      printf("Enter a ciphertext:\n");
      gets(C);
      
      for(i=0;C!='\0';i++)
                {
            if(C>='a'&&C<='z')
            {
               P=(C-'a'-K)%26+'a';
            }
            else if(C>='A'&&C<='Z')
            {
               P=(C-'A'-K)%26+'A';
            }
            else
                        {
                             P=' ';
            }
      }
      
      printf("The message is :\n%s\n",C);
      
      return 0;
}

梦回连营 发表于 2021-11-27 22:44:29

本帖最后由 梦回连营 于 2021-11-27 23:48 编辑

#include <stdio.h>
#include <string.h>

int main()
{
    char P = {'\0'};/*定义明文长度*/
    char C = {'\0'};/*定义密文长度*/
    int K = 3, i;

    printf("Please input message:\n"); /*输入明文*/
    gets(P); /* 接受明文*/


    for (i=0; P!='\0'; i++){/*逐个判断字母的大小*/
      if (P >= 'a' && P <= 'z') { /*小写字母 */
             C = (P - 'a' + K ) % 26 + 'a';
         }
      else if( P >= 'A' && P <= 'Z'){ /*大写字母 */
             C = (P - 'A' + K) % 26 + 'A';
         }
      else
            C=' ';/*如果不是字母,转换为空格*/
    }

    printf("The Ciphertext is :\n%s\n",C);/*输出密文*/

    printf("Enter a ciphertext:\n");
    gets(C);
    strcpy(P, C);
   
    for (i = 0; C != '\0' ; i++){
      if (C >= 'a' && C <= 'z'){
             P = (26 + C - 'a' - K ) % 26 + 'a';
      }
      else if ( C >= 'A' && C <= 'Z'){
             P = (26 + C - 'A' - K) % 26 + 'A';
      }
      else
            P=' ';
      
    }
   
    printf("The message is :\n%s\n",P);
   
    return 0;
}
你的代码里还是有一些其他问题的,我帮你改进了一下。数组没有初始化,会出现乱码问题。如果第二次输入解码的密文长度小于第一次输入的明文长度,但是没有重置,所以会把多出来的明文输出的。用strcpy相当于覆盖重置一下。

梦回连营 发表于 2021-11-27 23:35:42

倒数第二句打印输出,应该输出P,而不是C。

傻眼貓咪 发表于 2021-11-28 14:21:10

代码:#include <stdio.h>

int main()
{
    char P; // 只需一个数组便可
    int K = 3, i;
   
    printf("Please enter a message:\n");
    fgets(P, sizeof(P), stdin);
   
    for(i = 0; P != '\n'; i++){
      if(P >= 'a' && P <= 'z')
            P = (P - 'a' + K)%26 + 'a';
      else if(P >= 'A' && P <= 'Z')
            P = (P - 'A' + K)%26 + 'A';}
            
    printf("This is the Caesar Code:\n%.*s\n", i, P);
   
    for(; i >= 0; i--){
      if(P >= 'a' && P <= 'z')
            P = (P - 'a' - K + 26)%26 + 'a';
      else if(P >= 'A' && P <= 'Z')
            P = (P - 'A' - K + 26)%26 + 'A';}
            
    printf("This is the original message:\n%.*s\n", i, P);
   
    return 0;
}输入/输出:Please enter a message:
ABCabcXYZxyz
This is the Caesar Code:
DEFdefABCabc
This is the original message:
ABCabcXYZxyz

15873314901 发表于 2021-11-29 10:37:25

1
页: [1]
查看完整版本: 求助