C语言设计一个用简单的加密程序,即用字母替换的方式加密,程序运行中发现问题,求解释。
程序希望先输入一个密钥,然后输入少于49个字符的字符串,然后输出加密后的字符串,如:输入密钥key为5,输入字符串为abc的得到fgh,输入key60,输入字符串Abc,...
程序希望先输入一个密钥,然后输入少于49个字符的字符串,然后输出加密后的字符串,如:输入密钥key为5,输入字符串为abc的得到fgh,输入key60,输入字符串Abc,得到Ijk。即本程序只对大小写字母进行替换,其余的不替换,大写字母用该字母加上key进行替换,如果超过Z,则继续轮回,小写字母同理。
代码如下:
#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]))//对小写字母加密
{
str[i]+=key%26;
if(str[i]>'z')
{
str[i]-=26;
}
else if(str[i]<'a')
{
str[i]+=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);
}
}
开发环境为VC++6.0。
我的问题是,如果输入key为10,输入字符串为abcdefghijklmnopqrstuvwxyz时,得到的结果是klmnopqrstuvwxyzabcde殡浈?,有乱码。请问这是为什么? 展开
代码如下:
#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]))//对小写字母加密
{
str[i]+=key%26;
if(str[i]>'z')
{
str[i]-=26;
}
else if(str[i]<'a')
{
str[i]+=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);
}
}
开发环境为VC++6.0。
我的问题是,如果输入key为10,输入字符串为abcdefghijklmnopqrstuvwxyz时,得到的结果是klmnopqrstuvwxyzabcde殡浈?,有乱码。请问这是为什么? 展开
展开全部
原因就是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);
}
}
我的解决方法就很简单,就是换成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);
}
}
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
展开全部
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);
}
}
帮你改了一下,你看一下对不对。
#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);
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
zuorenwu xiexie
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
明显的溢出了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询