鱼C论坛

 找回密码
 立即注册
查看: 1151|回复: 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 编辑
#include <stdio.h>
#include <string.h>

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

最佳答案

查看完整内容

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

使用道具 举报

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

int main()
{
    char P[1000] = {'\0'};/*定义明文长度*/
    char C[1000] = {'\0'};/*定义密文长度*/
    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);
    strcpy(P, C);
    
    for (i = 0; C[i] != '\0' ; i++){
        if (C[i] >= 'a' && C[i] <= 'z'){
             P[i] = (26 + C[i] - 'a' - K ) % 26 + 'a';
        }
        else if ( C[i] >= 'A' && C[i] <= 'Z'){
             P[i] = (26 + C[i] - 'A' - K) % 26 + 'A';
        }
        else
            P[i]=' ';
        
    }
    
    printf("The message is :\n%s\n",P);
    
    return 0;
}
你的代码里还是有一些其他问题的,我帮你改进了一下。数组没有初始化,会出现乱码问题。如果第二次输入解码的密文长度小于第一次输入的明文长度,但是没有重置,所以会把多出来的明文输出的。用strcpy相当于覆盖重置一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

int main()
{
    char P[1000]; // 只需一个数组便可
    int K = 3, i;
    
    printf("Please enter a message:\n");
    fgets(P, sizeof(P), stdin);
    
    for(i = 0; P[i] != '\n'; i++){
        if(P[i] >= 'a' && P[i] <= 'z')
            P[i] = (P[i] - 'a' + K)%26 + 'a';
        else if(P[i] >= 'A' && P[i] <= 'Z')
            P[i] = (P[i] - 'A' + K)%26 + 'A';}
            
    printf("This is the Caesar Code:\n%.*s\n", i, P);
    
    for(; i >= 0; i--){
        if(P[i] >= 'a' && P[i] <= 'z')
            P[i] = (P[i] - 'a' - K + 26)%26 + 'a';
        else if(P[i] >= 'A' && P[i] <= 'Z')
            P[i] = (P[i] - '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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 03:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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