凯撒密码问题C语言程序

xiaoxiao2025-06-10  34

凯撒密码问题C语言程序

据说最早的密码来自于罗马的凯撒大帝。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字替换(例如:消息原文中的每个字母A都分别替换成字母F)。而你要做的消息原文,也就是要这个过程反过来。 密码字母:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 原文字母:V W X Y Z A B C D E F G H I J K L M N O P Q R S T U (注意:只是字母发生替换,其他非字母的字符不变,并且消息原文的所有字母都是大写。) 要求: 输入:最多不超多100分数据集组成,每个数据集之间不会有空行,每个数据集由3部分组成: 1.起始行:START 2.密码消息:由1到200个字符组成一行,表示凯撒发出的一条消息 3.结束行END 在最后一个数据集之后,是另起一行:ENDOFINPUT。 输出:是每个数据集对应一行,是凯撒的原始消息。

代码如下:

#include<stdio.h> #include<string.h> int main() { char str1[200]; //定义明文长度 char str2[10][200]={}; //定义密文长度 char tmp[20]; //定义临时变量 int i; int j=0; //循环变量 int len; printf("Sample Input:\n"); scanf("%s",tmp); getchar(); if (strcmp(tmp,"START")!=0) { printf("Input Error"); } //检测START是否输错 while(strcmp(tmp,"ENDOFINPUT")) { gets(str1);//由于输入中有空格,所以用gets输入 getchar();//接收回车 len = strlen(str1); for(i=0;i<len;i++) { if(str1[i]>='A'&&str1[i]<='Z') { str1[i] -= 5 ; if(str1[i] < 65) { str1[i] +=26; } } } scanf("%s",tmp); j++; strcpy(str2[j],str1); scanf("%s",tmp); getchar(); } printf("Sample Output"); for (int j=0;j<10;j++) puts(str2[j]); return 0; }

实验结果:

上面这个代码虽勉强能实现所要求的功能,但无法实现确认START,END,ENDOFINPUT是否输入正确等其他功能,经过本人一段时间的修改,完全版的代码终于完成。

代码如下:

#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { FILE *fp; fp=fopen("D:\\PassWord.txt","w+"); //创建文件 if (fp==0) { printf("file error\n"); exit(1); } char str1[200]; //定义明文长度 char str2[10][200]={}; //定义密文长度 char tmp[20]={}; //定义临时变量 int i; int j=0; //循环变量 int len; printf("* Sample Input:\n"); fprintf(fp,"* Sample Input:\n"); //写入文件 while (1) { scanf("%s",tmp); //接收起始行START getchar(); //接收空格,不可缺少 if (strcmp(tmp,"ENDOFINPUT")==0) //判断输入的字符串是否为ENDOFINPUT { fprintf(fp,"ENDOFINPUT\n"); //写入文件 break; } while (strcmp(tmp,"START")) //检验起始行START是否输入正确,正确才会进入下一步 { printf("Input Error!\n"); scanf("%s",tmp); getchar(); } fprintf(fp,"START\n"); //写入文件 char str1[200]={}; //初始化明文数组str1 gets(str1); //由于输入中有空格,所以用gets输入,接收明文 fputs(str1,fp); fprintf(fp,"\n"); //将明文写入文件 len = strlen(str1); //计算str1数组的长度 for(i=0;i<len;i++) //明文加密为密文 { if(str1[i]>='A'&&str1[i]<='Z') { str1[i] -= 5 ; if(str1[i] < 65) { str1[i] +=26; } } } char tmp[20]={}; //初始化tmp数组 scanf("%s",tmp); if (strcmp(tmp,"END")==0) //若结束后END输入正确,将密文录入密文数组str2 { /*printf("Input True!\n");*/ fprintf(fp,"END\n"); j++; strcpy(str2[j],str1); } else //若输入错误,将不录入这组密文 { fputs(tmp,fp); fprintf(fp," Input Error!! 此组密文将不被录入!\n"); printf("Input Error!!\n"); } } printf("* Sample Output"); fprintf(fp,"* Sample Output:"); for (int j=0;j<10;j++) { puts(str2[j]); fputs(str2[j],fp); //将密文写入文件 fprintf(fp,"\n"); } fclose(fp); //关闭文件 return 0; }

运行结果: 参考代码链接: 参考1 参考2

转载请注明原文地址: https://www.6miu.com/read-5031635.html

最新回复(0)