首页 > 编程知识 正文

凯撒密码问题C语言程序

时间:2023-05-05 07:10:40 阅读:250369 作者:2040

着急的万宝路密码问题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 errorn"); 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,"ENDOFINPUTn"); //写入文件 break;} while (strcmp(tmp,"START")) //检验起始行START是否输入正确,正确才会进入下一步 { printf("Input Error!n"); scanf("%s",tmp); getchar(); } fprintf(fp,"STARTn"); //写入文件 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,"ENDn"); 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

见缝插针游戏的实现途径阿诺德渲染器gpu需要学习么?Git-查找回购中哪些应用已更改Python Numpy常用函数总结

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。