C语言中最简单的字符串加密解密问题!!!!希望大家帮帮忙,分不是问题 !!

刚学C语言不久,自己照书上编了个文件加密的程序,程序如下:#include"stdio.h"#include"ctype.h"main(){charch,name[30]... 刚学C语言不久,自己照书上编了个文件加密的程序,程序如下:
#include"stdio.h"
#include"ctype.h"
main()
{
char ch,name[30],over;
FILE *fp;
printf("请输入要加密的文件名(如果文件不存在将自动建立新文件):\a");
gets(name);
fp = fopen(name,"w");
printf("请输入要加密的文件内容:\n");
ch = getc(stdin);
while(ch!=EOF)
{
if(isalpha(ch))
{
if((ch >= 'w' && ch <= 'z') || (ch >= 'W' && ch <='Z'))
ch = ch - 22;
else
ch = ch + 4;
}
fputc(ch,fp);
ch=getc(stdin);
}
printf("%s已成功加密!\n",name);
printf("加密后的文件内容:\n");
rewind(fp);
fp = fopen(name,"r");
while((ch=fgetc(fp))!=EOF)
putchar(ch);
fclose(fp);
exit(0);
}

加密的原理很简单,相信大家一看就懂。
可是我利用同样的原理,制作解密的程序,却怎么尝试都不行,解密程序如下:
#include"stdio.h"
#include"ctype.h"
main()
{
char ch,name[30];
FILE *fp;
printf("请输入要解密的文件名:\a");
gets(name);
fp = fopen(name,"r+");
if(fp==NULL)
{
printf("没有找到需解密的文件%s!\n\a",name);
exit(0);
}
ch = getc(fp);
while(ch!=EOF)
{
if((isalpha(ch))!=0)
{
if((ch >= 'a' && ch <= 'd') || (ch >= 'A' && ch <='D'))
ch = ch + 22;
else
ch = ch - 4;
}
fputc(ch,fp);
ch = getc(fp);
}
fclose(fp);
printf("%s解密成功!\a\n",name);
printf("解密后的文件内容:\n");
rewind(fp);
fp=fopen(name,"r");
while((ch=fgetc(fp))!=EOF)
putchar(ch);
fclose(fp);
printf("\n");
exit(0);
}

各位高手帮忙看看是哪里出了问题吧!!最好能详细的分析一下,回答的好追更多分,分不是问题 !!!
展开
 我来答
starfar1983
推荐于2017-10-11 · TA获得超过2259个赞
知道小有建树答主
回答量:692
采纳率:0%
帮助的人:1042万
展开全部
加密解密的算法都没错,错的是解密程序里的文件操作方法。
rewind(fp)没有必要。因为fp已经被close了。
一般不推荐同时对一个文件又读又写,因为这样会导致很多缓冲区同步的问题。比如:
fputc()和getc()之间,必须要调用fflush(fp);
即使这样,还是会有问题。比如回车,getc()可能会返回两个字符,\n和\a。但是用fputc()写入的时候,分别写入\n和\a会把第二行第一个字符覆盖掉。

正确的做法是:
先把解密的数据保存到字符串里,全部结束之后,一次性把解密完的字符串写到文件里去。

void main()
{
char ch,name[30];
char content[1000];
int n = 0;
FILE *fp;
printf("name:\a");
gets(name);
fp = fopen(name,"r+");
if(fp==NULL)
{
printf("No file: %s!\n\a",name);
return;
}
ch = getc(fp);
while(ch!=EOF)
{
if((isalpha(ch))!=0)
{
if((ch >= 'a' && ch <= 'd') || (ch >= 'A' && ch <='D'))
ch = ch + 22;
else
ch = ch - 4;
}
content[n++] = ch;
ch = getc(fp);
//ch = getc(fp);
}
content[n] = 0;
rewind(fp);
fprintf(fp, "%s", content);
fclose(fp);

printf("%s ok\a\n",name);
printf("content: %s\n", content);
printf("\n");
}
宠物族宝贝
2010-12-22 · TA获得超过188个赞
知道答主
回答量:74
采纳率:0%
帮助的人:39.1万
展开全部
wkjf
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
陈宗权8d804
2010-12-21 · TA获得超过3766个赞
知道小有建树答主
回答量:1159
采纳率:0%
帮助的人:967万
展开全部
问题在于,你的加密算法是不可逆的,也就是说,无法保证解密。
比如原文是aw,加密之后是aa,你解密成什么啊?ww?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式