如题,谢谢各位了
#include <stdio.h> // 标准输入输出函数
#include <stdlib.h> // 标准库函数
#include <string.h> // 字符串处理函数
#include <ctype.h> // 字符操作函数
#include <conio.h> // 控制台输入输出函数,虽然不是标准头文件,但是大部分编译器都支持
void printMenu(void);
int checkPwd(int type);
int encryptFile(char *sourcefile, char *secretKey,char *targetFile);
char redo(void);
int main(){
char sourcefile[30], // 加密/解密的文件名
targetFile[30], // 解密/加密后要保存的文件名
secretKey[21], // 文件加密的密钥
action; // 要进行的操作
while(1){
system("cls"); // 清屏
printMenu(); // 显示菜单
scanf("%c",&action); // 输入要执行的操作
fflush(stdin); // 清空stdin缓冲区
system("cls");
switch(action){
// 退出系统
case 'z':
exit(0);
break;
// 文件加密
case 'a':
while(1){
printf("输入要加密的文件名(含路径):");
scanf("%s", sourcefile);
printf("输入密钥:"); //密钥是用户自己定义的,可以随意给需要加密的文件添加密钥
scanf("%s", secretKey);
printf("加密后的文件名(含路径):"); //给加密后的文件命名,并保存
scanf("%s",targetFile);
if( encryptFile(sourcefile, secretKey, targetFile) ){
printf("文件[%s]加密成功,保存在[%s]。\n", sourcefile, targetFile);
}
if(redo() == 'a'){ // 继续加密文件
system("cls");
}else{ // 回到主菜单
break;
}
}
break;
// 文件解密
case 'b':
while(1){
printf("输入要解密的文件名(含路径):");
scanf("%s",sourcefile);
printf("输入密钥:");
scanf("%s",secretKey);
printf("解密后的文件名(含路径):"); //对解密的文件系统又可以提供保存路径
scanf("%s", targetFile);
if( encryptFile(sourcefile, secretKey, targetFile) ){
printf("文件[%s]解密成功,保存在[%s]。\n", sourcefile, targetFile);
}
if(redo() == 'a'){ // 继续解密文件
system("cls");
}else{
break; // 回到主菜单
}
}
break;
// 将信息输入到文件中
case 'c':
while(1){
struct stu
{
char name[10];
int num;
int age;
char addr[15];
}boya[2],boyb[2],*pp,*qq;
{
FILE *fp;
char ch;
int i;
pp=boya;
qq=boyb;
if((fp=fopen("F:\\ceshi.txt","wb+"))==NULL)
{
printf("Cannot open file strike any key exit!");
}
printf("\ninput data\n");
for(i=0;i<2;i++,pp++)
{
scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
}
pp=boya;
fwrite(pp,sizeof(struct stu),2,fp);
//将文件指针重新指向一个流的开头
rewind(fp);
fread(qq,sizeof(struct stu),2,fp);
printf("\n\nname\tnumber age addr\n");
for(i=0;i<2;i++,qq++)
{
printf("%s\t%5d%7d %s\n",qq->name,qq->num,qq->age,qq->addr);
}
fclose(fp);
}
if(redo() == 'a'){ // 继续修改密码
system("cls");
}else{ // 回到主菜单
break;
}
}
break;
default:
printf("没有相应的菜单!按任意键回到主菜单...");
getch();
}
}
return EXIT_SUCCESS;
}
/**
* 显示程序菜单
**/
void printMenu(){
printf("***************** 文本加密解密软件 *****************\n");
printf("* *\n");
printf("* 请从下面的菜单中选择你要进行的操作: *\n");
printf("* a. 文件加密 *\n");
printf("* b. 文件解密 *\n");
printf("* c. 将信息存放到文件中 *\n");
printf("* z. 退出系统 *\n");
printf("* *\n");
printf("****************************************************\n");
}
/**
* 加密/解密文件
*
* @param sourcefile 要加密/解密的文件名
* @param secretKey 密钥
* @param targetFile 加密/解密后要保存的文件名
*
* @return 加密成功或失败的数字表示
0:加密失败
1:加密成功
**/
int encryptFile(char *sourcefile, char *secretKey, char *targetFile){
FILE *fpSource, *fpTarget; // 要打开的文件的指针
char buffer[21]; // 缓冲区,用于存放从文件读取的数据
int readCount, // 每次从文件中读取的字节数
keyLen = strlen(secretKey), // 密钥的长度
i; // 循环次数
// 以二进制方式读取/写入文件
fpSource = fopen(sourcefile, "rb");
if(fpSource==NULL){
printf("文件[%s]打开失败,请检查文件路径和名称是否输入正确!\n", sourcefile);
return 0;
}
fpTarget = fopen(targetFile, "wb");
if(fpTarget==NULL){
printf("文件[%s]创建/写入失败!请检查文件路径和名称是否输入正确!\n", fpTarget);
return 0;
}
// 不断地从文件中读取 keyLen 长度的数据,保存到buffer,直到文件结束
while( (readCount=fread(buffer, 1, keyLen, fpSource)) > 0 ){
// 对buffer中的数据逐字节进行异或运算
for(i=0; i<readCount; i++){
buffer[i] ^= secretKey[i];
}
// 将buffer中的数据写入文件
fwrite(buffer, 1, readCount, fpTarget);
}
fclose(fpSource);
fclose(fpTarget);
return 1;
}
/**
* 当前操作完成,要进行的下一次操作(次要菜单)
*
* @return 下一次操作的字母表示
a:回到主菜单
b:继续当前操作
**/
char redo(){
char action;
printf("\n接下来你希望:\n");
printf("a. 继续当前操作\n");
printf("b. 回到主菜单\n");
// 不停的等待用户输入,直到输入正确
while(1){
fflush(stdin);
scanf("%c", &action);
fflush(stdin);
if(action!='a' && action!='b'){
printf("没有相应的菜单,请重新选择。\n");
}else{
return action;
break;
}
}
}
要使代码能够根据需要灵活改变加密方式,可以进行以下修改:
1.在主函数中定义一个变量来表示加密方式,例如使用一个整型变量encryptionMethod,并在菜单中添加对应选项。
2.根据用户选择的加密方式,调用相应的加密函数。可以为每种加密方式编写一个单独的函数。
3.修改encryptFile函数,使其根据传入的加密方式进行加密操作。
下面是修改后的代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
void printMenu(void);
int checkPwd(int type);
int encryptFile(char *sourcefile, char *secretKey, char *targetFile, int encryptionMethod);
char redo(void);
int main() {
char sourcefile[30], targetFile[30], secretKey[21], action;
int encryptionMethod; // 加密方式
while (1) {
system("cls");
printMenu();
scanf("%c", &action);
fflush(stdin);
system("cls");
switch (action) {
case 'z':
exit(0);
break;
case 'a':
while (1) {
printf("输入要加密的文件名(含路径):");
scanf("%s", sourcefile);
printf("输入密钥:");
scanf("%s", secretKey);
printf("加密后的文件名(含路径):");
scanf("%s", targetFile);
printf("选择加密方式:\n");
printf("1. 异或加密\n");
printf("2. 其他加密方式\n");
printf("请选择:");
scanf("%d", &encryptionMethod);
if (encryptFile(sourcefile, secretKey, targetFile, encryptionMethod)) {
printf("文件[%s]加密成功,保存在[%s]。\n", sourcefile, targetFile);
}
if (redo() == 'a') {
system("cls");
} else {
break;
}
}
break;
case 'b':
while (1) {
printf("输入要解密的文件名(含路径):");
scanf("%s", sourcefile);
printf("输入密钥:");
scanf("%s", secretKey);
printf("解密后的文件名(含路径):");
scanf("%s", targetFile);
printf("选择解密方式:\n");
printf("1. 异或解密\n");
printf("2. 其他解密方式\n");
printf("请选择:");
scanf("%d", &encryptionMethod);
if (encryptFile(sourcefile, secretKey, targetFile, encryptionMethod)) {
printf("文件[%s]解密成功,保存在[%s]。\n", sourcefile, targetFile);
}
if (redo() == 'a') {
system("cls");
} else {
break;
}
}
break;
case 'c':
// 省略信息存放到文件中的代码
break;
default:
printf("没有相应的菜单!按任意键回到主菜单...");
getch();
}
}
return EXIT_SUCCESS;
}
void printMenu() {
printf("***************** 文本加密解密软件 *****************\n");
printf("* *\n");
printf("* 请从下面的菜单中选择你要进行的操作: *\n");
printf("* a. 文件加密 *\n");
printf("* b. 文件解密 *\n");
printf("* c. 将信息存放到文件中 *\n");
printf("* z. 退出系统 *\n");
printf("* *\n");
printf("****************************************************\n");
}
int encryptFile(char *sourcefile, char *secretKey, char *targetFile, int encryptionMethod) {
FILE *fpSource, *fpTarget;
char buffer[21];
int readCount, keyLen = strlen(secretKey), i;
fpSource = fopen(sourcefile, "rb");
if (fpSource == NULL) {
printf("文件[%s]打开失败,请检查文件路径和名称是否输入正确!\n", sourcefile);
return 0;
}
fpTarget = fopen(targetFile, "wb");
if (fpTarget == NULL) {
printf("文件[%s]创建/写入失败!请检查文件路径和名称是否输入正确!\n", fpTarget);
return 0;
}
while ((readCount = fread(buffer, 1, keyLen, fpSource)) > 0) {
if (encryptionMethod == 1) { // 异或加密
for (i = 0; i < readCount; i++) {
buffer[i] ^= secretKey[i];
}
} else {
// 其他加密方式的处理逻辑
}
fwrite(buffer, 1, readCount, fpTarget);
}
fclose(fpSource);
fclose(fpTarget);
return 1;
}
char redo() {
char action;
printf("\n接下来你希望:\n");
printf("a. 继续当前操作\n");
printf("b. 回到主菜单\n");
while (1) {
fflush(stdin);
scanf("%c", &action);
fflush(stdin);
if (action != 'a' && action != 'b') {
printf("没有相应的菜单,请重新选择。\n");
} else {
return action;
break;
}
}
}
在上述代码中,添加了一个整型变量encryptionMethod来表示加密方式,用户可以在加密和解密操作时选择加密方式。在encryptFile函数中,根据传入的encryptionMethod值,选择不同的加密方式进行加密操作。
栈 先进后出,队列 先进先出。我们本实验所使用的队列只有基本的 全部入队 全部出队,所以直接使用普通的数组代替即可。下面是栈的实现。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char stack[50][20];
//栈顶位置,初始时没有元素
int sTop = -1;
//入栈
void push(char *key)
{
++sTop;
strcpy(stack[sTop], key);
}
//出栈
void pop()
{
--sTop;
}
//查看栈顶元素,无元素返回NULL
char* top()
{
if (sTop == -1)
return NULL;
else
return stack[sTop];
}
char queue[50][20];
//队列中的元素个数
int qCnt = 0;
int main()
{
int cmd;
char input[20];
while(1)
{
printf("\t\t0 退出\n\t\t1 入栈\n\t\t2 出栈\n\t\t3 查看栈顶元素\n\n");
scanf("%d", &cmd);
if (cmd == 0)
break;
switch(cmd)
{
case 1: printf("输入元素:"); scanf("%s", input); push(input); break;
case 2: pop(); break;
case 3: printf("栈顶元素:%s\n", top()); break;
}
}
return 0;
}