问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

...简单的加密程序,即用字母替换的方式加密,程序运行中发现问题,求解释...

发布网友 发布时间:2024-10-02 10:07

我来回答

4个回答

热心网友 时间:2024-10-07 03:12

原因就是char是1个字节的,你不能超过127(hi,楼上的,不是128哦,是-128~127不要误人子弟),你到后面的vwxyz已经溢出,所以是乱码。
我的解决方法就很简单,就是换成unsigned char 数组,这样取值范围增大到(0~255)就可以了,既简单又不破坏原有的结构

还有
else if(str[i]<'a')
{
str[i]+=26;
}
这句话是废话,可以删掉

我修改过的版本
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void EncodeString(unsigned char *str,int key)
{
int length,i;//length为传入字符串长度,i用作循环计数器
length=strlen(str);
for(i=0;i<length;i++)//对字符串中的每个字符依次进行加密
{
if(isupper(str[i]))//对大写字母加密
{
str[i]+=key%26;
if(str[i]>'Z')
{
str[i]-=26;
}

}
else if(islower(str[i]))//对小写字母加密
{
str[i]+=key%26;
if(str[i]>'z')
{
str[i]-=26;
}

}

}
}

void main()
{
unsigned char arr[50],buffer;//arr[50]用来接收字符串信息,buffer用来接收缓冲区中的回车
int key;//key为加密秘钥
printf("This program encodes messages using a cyclic cipher.\n");
printf("To stop, enter 0 as the key.\n");
while(1)//程序一直运行,直到输入密钥0为止
{
printf("Enter the key: ");
scanf("%d",&key);
scanf("%c",&buffer);
if(0==key)
{
break;//输入密钥为0,则退出程序
}
printf("Enter a message: ");
scanf("%s",arr);
scanf("%c",&buffer);
EncodeString(arr,key);
printf("Encoded message: %s\n",arr);
}
}

热心网友 时间:2024-10-07 03:17

char 型数组对应的ASCII码最大只能到128,最后几位加上key%26后超过了这个范围,所以会出现乱码。
帮你改了一下,你看一下对不对。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void EncodeString(char *str,int key)
{
int length,i;//length为传入字符串长度,i用作循环计数器
length=strlen(str);
for(i=0;i<length;i++)//对字符串中的每个字符依次进行加密
{
if(isupper(str[i]))//对大写字母加密
{
str[i]+=key%26;
if(str[i]>'Z')
{
str[i]-=26;
}
else if(str[i]<'A')
{
str[i]+=26;
}
}
else if(islower(str[i]))//对小写字母加密
{
if(str[i]+key%26<128){
str[i]+=key%26;
if(str[i]>'z')
{
str[i]-=26;
}
else if(str[i]<'a')
{
str[i]+=26;
}
}
else{str[i]-=26;str[i]+=key%26;}
}

}
}

void main()
{
char arr[50],buffer;//arr[50]用来接收字符串信息,buffer用来接收缓冲区中的回车
int key;//key为加密秘钥
printf("This program encodes messages using a cyclic cipher.\n");
printf("To stop, enter 0 as the key.\n");
while(1)//程序一直运行,直到输入密钥0为止
{
printf("Enter the key: ");
scanf("%d",&key);
scanf("%c",&buffer);
if(0==key)
{
break;//输入密钥为0,则退出程序
}
printf("Enter a message: ");
scanf("%s",arr);
scanf("%c",&buffer);
EncodeString(arr,key);
printf("Encoded message: %s\n",arr);
}
}

热心网友 时间:2024-10-07 03:11

zuorenwu xiexie

热心网友 时间:2024-10-07 03:10

明显的溢出了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
云顶s7有变形重组器吗? 云顶之弈棋盘怎么买 《云顶之弈 巨龙之境》系列道具限时销售公告 霍金死前留下的7个预言,三个正在上演 霍金七大预言是什么 康熙来了说的经痛布偶抱枕的那只牛是什么牛 常旅客计划常旅客计划 常旅客计划的介绍 女人叫你哥哥的暗示? 请问各位老师,这是什么病害? PS如何将三个照片拼在一起ps如何将三个照片拼在一起打印 成都锦江区天然气气卡丢掉,因户主不在,是否可以不用户主身份证补办... 成都锦江区天燃气每立方价?自耒水每吨价? 合肥复读学校哪家好 安徽有哪些高复学校 干洗的衣服有个味道,不好闻不舒服,请问那是什么,有害吗? 上海要怎么点亮QQ邮箱.QQ相册.超级旋风.QQ书签.QQTalk团队语音还有Q... 我已有下载QQ旋风,要怎样点亮QQ旋风的图标?拜托了各位 谢谢 怎样点亮QQ上的,邮箱和旋风图像 QQ旋风和QQ邮箱怎么点亮? 联想电脑国外价格真比国内便宜吗?为什么?因为关税吗? 联想电脑ThinkpadT14 Gen3LTE1多少钱 邢台九龙峡自然风光旅游区的简介 九龙峡邢台九龙峡景点 女朋友说我经常带她吃快餐,她姐姐带她吃牛扒,说落差很大。搞的好伤 学校花圃可以种哪植物 九龙峡九龙峡风景区简介 含翠和婷的诗句,或者含翠的词语,成语。快一点,写得好的qq发6元。 适合学校花圃种植的绿植 校园内花圃宜种什么花 四指 手柄上面的那个触屏的东西是什么? 广东湛江四星级的酒店有哪些,湛江市景区星级酒店有哪些 刮痧后好像起风团是什么原因 我就黎要结婚啦又唔知去边度影婚纱相好请大家帮我解答下 rust自动下载地图吗 谁有RUST小地图(雷达)WIN7 32位能用的 在线等! 新疆怎么淘石榴石矿石 石榴石产地都有哪些 ...惊艳的湘北在全国大赛上被评为C级的原因是什么? 在灌篮高手里,为什么在神奈川表现惊艳的湘北,在全国大赛上却被评为C... 《灌篮高手》中的记者相田弥生,为什么相对偏袒陵南而瞧不起湘北? 我的是oppor9m 锁屏密码忘记了 怎么清除锁屏密码手机是没有卡的? 我的世界在空中如何下到地面 聊城有哪些景点 小学六年级可以转学籍吗?要做哪些准备? 上网行为管理原因 网易云音乐点赞取消对方能看到吗? 华为手机如何查看已经接收过的所有短信通知 上海大闸蟹价格降一半 秋季吃大闸蟹注意什么 已经装修好了的地下室还可以做防潮吗?