求助
有没有谁帮我看一下我写的代码哪里错了?它可以运行但运行的结果有问题,运行结果看图在密码学中,恺撒密码是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。向后移动的位数就是密钥,例如,密钥 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 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相当于覆盖重置一下。 倒数第二句打印输出,应该输出P,而不是C。 代码:#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 1
页:
[1]