请问如何在下方代码的基础上实现第四项

如题,谢谢各位了

img


#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值,选择不同的加密方式进行加密操作。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7746538
  • 这篇博客你也可以参考下:输入两个整数,输出由输入的两个整数组合而成的四位整数
  • 除此之外, 这篇博客: 堆栈应用四则运算表达式求值中的 栈 和 队列 的实现 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 栈 先进后出,队列 先进先出。我们本实验所使用的队列只有基本的 全部入队 全部出队,所以直接使用普通的数组代替即可。下面是栈的实现。

    #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;
    }
    

    image-20220420155915741

  • 您还可以看一下 郑朝军老师的产品经理思维课程中的 【录播】四象限法则划分需求优先级小节, 巩固相关知识点