小问题!!!散分散分散分散分散分散分散分散分散分散分~~~~~!!!!!!

lkjx82 2002-09-09 05:26:55
/*给文件加密的技术很多,其中又分为不同等级,以适合不同场合的需要.这里给出最简单的文件加密技术
,即采用文件逐字节与密码异或方式对文件进行加密,当解密时,只需再运行一遍加密程序即可.

下面是一个实例程序,能对任意一个文件进行加密,密码要求用户输入,限8位以内(当然你可以再更改).
程序有很好的容错设计,这是我们应该学习的.

Turbo 2.0 pass. give file a password! */

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>

void dofile(char *in_fname,char *pwd,char *out_fname);/*对文件进行加密的具体函数*/

void main(int argc,char *argv[])/*定义main()函数的命令行参数*/
{
char in_fname[30];/*用户输入的要加密的文件名*/
char out_fname[30];
char pwd[8];/*用来保存密码*/

if(argc!=4){/*容错处理*//*????????????????*/
printf("\nIn-fname:\n");
gets(in_fname);/*得到要加密的文件名*/

printf("Password:\n");
gets(pwd);/*得到密码*/

printf("Out-file:\n");
gets(out_fname);/*得到加密后你要的文件名*/


dofile(in_fname,pwd,out_fname);
}
else{/*如果命令行参数正确,便直接运行程序*/
strcpy(in_fname,argv[1]);
strcpy(pwd,argv[2]);
strcpy(out_fname,argv[3]);
dofile(in_fname,pwd,out_fname);
}

}


/*加密子函数开始*/
void dofile(char *in_fname,char *pwd,char *out_file)
{
FILE *fp1,*fp2;
register char ch;
int j=0;
int j0=0;

fp1=fopen(in_fname,"rb");
if(fp1==NULL){
printf("cannot open in-file.\n");
exit(1);/*如果不能打开要加密的文件,便退出程序*/
}
fp2=fopen(out_file,"wb");
if(fp2==NULL){
printf("cannot open or create out-file.\n");
exit(1);/*如果不能建立加密后的文件,便退出*/
}
while(pwd[++j0]); /*????????这里是什么作用?????????*/
ch=fgetc(fp1); /*????????这里是什么作用??????????*/

/*加密算法开始*/
while(!feof(fp1)){
fputc(ch^pwd[j>=j0?j=0:j++],fp2); /*????????????????????????????????????????????*/
ch=fgetc(fp1);
}
fclose(fp1);/*关闭源文件*/
fclose(fp2);/*关闭目标文件*/
}

/*程序结束*/




1)这里指的容错原文注释说是在主函数加命令行参数,原理是什么?????
2)为什么还要把in_fname,pwd,out_fname都传递到给主函数的命令行参数?????
3)还有就是加密函数中while(pwd[++j0]); ch=fgetc(fp1); 是什么作用?????
4)注释问号的地方也希望大家给个解答!!!!!!







...全文
31 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgch007 2002-09-09
  • 打赏
  • 举报
回复
up
sjd163 2002-09-09
  • 打赏
  • 举报
回复
up
TLFLY 2002-09-09
  • 打赏
  • 举报
回复
呵呵, 4的改写blue_coco(潘) 是对的
blue_coco 2002-09-09
  • 打赏
  • 举报
回复
1>main的参数说明。
第一个是传入参数的个数,
第一个是传入参数的地址。
2》不想传入,就写常量了。
3>
while (pwd[++j0])计算password的字母个数
ch = fgetc (fp1)从流中取一字符


4>
改写:
int temp;

if (j>=j0)
{
temp = j = 0;
}
else
{
temp = j++;
}
^为异或

fputc(ch^pwd[temp],fp2);
TLFLY 2002-09-09
  • 打赏
  • 举报
回复
这些都是很基本的c代码啊, 又不明白我得qq是54951742
给分
unicode 2002-09-09
  • 打赏
  • 举报
回复
mark
TLFLY 2002-09-09
  • 打赏
  • 举报
回复
1. main函数可以传递程序运行时的命令行参数 如: lock filein fileout pwd 时
argc=4, argv[0]="lock" 就是运行地程序名 argv[1] =" filein" 就是第二个参数...

2.他这里一种是直接把源文件, 目标文件,口令全部作为参数传给程序(argc=4的时候), 第二种是运行后叫
用户输入参数(argc!=4的时候).

3.while(pwd[++j0]); 是取得字符串pwd的长度, 因为c字符串以0结尾.
ch=fgetc(fp1); 是重源文件中读入一个字符.

4.fputc(ch^pwd[j>=j0?j=0:j++],fp2);
这段语句等效于
if( j >= j0 )
{
j = 0;
}else
{
j++;
}
fputc(ch^pwd[j],fp2);
lkjx82 2002-09-09
  • 打赏
  • 举报
回复
请大家多多帮忙啊
分不够还可以再加~~~~~~~~~~~~~

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧