鱼C论坛

 找回密码
 立即注册
查看: 944|回复: 4

[已解决]求助

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

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

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

        printf("Enter a ciphertext:\n");
        gets(C);
        
        for(i=0;C[i]!='\0';i++)
                {
            if(C[i]>='a'&&C[i]<='z')
            {
                 P[i]=(C[i]-'a'-K)%26+'a';
            }
            else if(C[i]>='A'&&C[i]<='Z')
            {
                 P[i]=(C[i]-'A'-K)%26+'A';
            }
            else
                        {
                             P[i]=' ';
            }
        }
        
        printf("The message is :\n%s\n",C);
        
        return 0;
}
最佳答案
2021-11-27 22:44:29
本帖最后由 梦回连营 于 2021-11-27 23:48 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.     char P[1000] = {'\0'};/*定义明文长度*/
  6.     char C[1000] = {'\0'};/*定义密文长度*/
  7.     int K = 3, i;

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


  10.     for (i=0; P[i]!='\0'; i++){  /*逐个判断字母的大小*/
  11.         if (P[i] >= 'a' && P[i] <= 'z') { /*小写字母 */
  12.              C[i] = (P[i] - 'a' + K ) % 26 + 'a';
  13.          }
  14.         else if( P[i] >= 'A' && P[i] <= 'Z'){ /*大写字母 */
  15.              C[i] = (P[i] - 'A' + K) % 26 + 'A';
  16.          }
  17.         else
  18.             C[i]=' ';/*如果不是字母,转换为空格*/
  19.     }

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

  21.     printf("Enter a ciphertext:\n");
  22.     gets(C);
  23.     strcpy(P, C);
  24.    
  25.     for (i = 0; C[i] != '\0' ; i++){
  26.         if (C[i] >= 'a' && C[i] <= 'z'){
  27.              P[i] = (26 + C[i] - 'a' - K ) % 26 + 'a';
  28.         }
  29.         else if ( C[i] >= 'A' && C[i] <= 'Z'){
  30.              P[i] = (26 + C[i] - 'A' - K) % 26 + 'A';
  31.         }
  32.         else
  33.             P[i]=' ';
  34.         
  35.     }
  36.    
  37.     printf("The message is :\n%s\n",P);
  38.    
  39.     return 0;
  40. }
复制代码

你的代码里还是有一些其他问题的,我帮你改进了一下。数组没有初始化,会出现乱码问题。如果第二次输入解码的密文长度小于第一次输入的明文长度,但是没有重置,所以会把多出来的明文输出的。用strcpy相当于覆盖重置一下。
2021-11-27 (2).png

最佳答案

查看完整内容

你的代码里还是有一些其他问题的,我帮你改进了一下。数组没有初始化,会出现乱码问题。如果第二次输入解码的密文长度小于第一次输入的明文长度,但是没有重置,所以会把多出来的明文输出的。用strcpy相当于覆盖重置一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 22:44:29 | 显示全部楼层    本楼为最佳答案   
本帖最后由 梦回连营 于 2021-11-27 23:48 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.     char P[1000] = {'\0'};/*定义明文长度*/
  6.     char C[1000] = {'\0'};/*定义密文长度*/
  7.     int K = 3, i;

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


  10.     for (i=0; P[i]!='\0'; i++){  /*逐个判断字母的大小*/
  11.         if (P[i] >= 'a' && P[i] <= 'z') { /*小写字母 */
  12.              C[i] = (P[i] - 'a' + K ) % 26 + 'a';
  13.          }
  14.         else if( P[i] >= 'A' && P[i] <= 'Z'){ /*大写字母 */
  15.              C[i] = (P[i] - 'A' + K) % 26 + 'A';
  16.          }
  17.         else
  18.             C[i]=' ';/*如果不是字母,转换为空格*/
  19.     }

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

  21.     printf("Enter a ciphertext:\n");
  22.     gets(C);
  23.     strcpy(P, C);
  24.    
  25.     for (i = 0; C[i] != '\0' ; i++){
  26.         if (C[i] >= 'a' && C[i] <= 'z'){
  27.              P[i] = (26 + C[i] - 'a' - K ) % 26 + 'a';
  28.         }
  29.         else if ( C[i] >= 'A' && C[i] <= 'Z'){
  30.              P[i] = (26 + C[i] - 'A' - K) % 26 + 'A';
  31.         }
  32.         else
  33.             P[i]=' ';
  34.         
  35.     }
  36.    
  37.     printf("The message is :\n%s\n",P);
  38.    
  39.     return 0;
  40. }
复制代码

你的代码里还是有一些其他问题的,我帮你改进了一下。数组没有初始化,会出现乱码问题。如果第二次输入解码的密文长度小于第一次输入的明文长度,但是没有重置,所以会把多出来的明文输出的。用strcpy相当于覆盖重置一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-27 23:35:42 | 显示全部楼层
倒数第二句打印输出,应该输出P,而不是C。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-28 14:21:10 | 显示全部楼层
代码:
  1. #include <stdio.h>

  2. int main()
  3. {
  4.     char P[1000]; // 只需一个数组便可
  5.     int K = 3, i;
  6.    
  7.     printf("Please enter a message:\n");
  8.     fgets(P, sizeof(P), stdin);
  9.    
  10.     for(i = 0; P[i] != '\n'; i++){
  11.         if(P[i] >= 'a' && P[i] <= 'z')
  12.             P[i] = (P[i] - 'a' + K)%26 + 'a';
  13.         else if(P[i] >= 'A' && P[i] <= 'Z')
  14.             P[i] = (P[i] - 'A' + K)%26 + 'A';}
  15.             
  16.     printf("This is the Caesar Code:\n%.*s\n", i, P);
  17.    
  18.     for(; i >= 0; i--){
  19.         if(P[i] >= 'a' && P[i] <= 'z')
  20.             P[i] = (P[i] - 'a' - K + 26)%26 + 'a';
  21.         else if(P[i] >= 'A' && P[i] <= 'Z')
  22.             P[i] = (P[i] - 'A' - K + 26)%26 + 'A';}
  23.             
  24.     printf("This is the original message:\n%.*s\n", i, P);
  25.    
  26.     return 0;
  27. }
复制代码
输入/输出:
  1. Please enter a message:
  2. ABCabcXYZxyz
  3. This is the Caesar Code:
  4. DEFdefABCabc
  5. This is the original message:
  6. ABCabcXYZxyz
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-29 10:37:25 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 03:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表