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);
}
各位高手帮忙看看是哪里出了问题吧!!最好能详细的分析一下,回答的好追更多分,分不是问题 !!! 展开
#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);
}
各位高手帮忙看看是哪里出了问题吧!!最好能详细的分析一下,回答的好追更多分,分不是问题 !!! 展开
3个回答
展开全部
加密解密的算法都没错,错的是解密程序里的文件操作方法。
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");
}
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");
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询