C语言循环菜单的设计–让程序一直运行

让程序一直运行的秘密就是死循环,即:

while(1){
    // 要执行的操作
}

在加密解密软件中,要实现的功能有:

  • 文件加密;
  • 文件解密;
  • 修改密码(为了防止其他人使用,程序设置了密码,必须输入密码才能使用程序);
  • 退出系统。

相应的主菜单也有这些,请看下面的代码:

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

// 函数原型
void printMenu();
void returnToMenu(char *msg);

int main(){
    char action;
    while(1){
        system("cls");  // 清屏
        printMenu();  // 显示主菜单
        scanf("%c",&action);  // 输入要执行的操作
        fflush(stdin);  // 刷新(清空)stdin缓冲区
        system("cls");
       
        switch(action){
            case 'a':
            case 'A':
                returnToMenu("文件加密成功!");
                break;

            case 'b':
            case 'B':
                returnToMenu("文件解密成功!");
                break;

            case 'c':
            case 'C':
                returnToMenu("更改密码成功!");
                break;

            case 'z':
            case 'Z':
                exit(0);

            default:
                returnToMenu("没有相应的菜单!");
        }

    } 
    return 0;
}

// 打印主菜单
void printMenu(){
    printf("******************* 文本加密解密软件 *******************\n");
    printf("*                                                      *\n");
    printf("*      请从下面的菜单中选择你要进行的操作:            *\n");
    printf("*      a. 文件加密                                     *\n");
    printf("*      b. 文件解密                                     *\n");
    printf("*      c. 更改密码                                     *\n");
    printf("*      z. 退出系统                                     *\n");
    printf("*                                                      *\n");
    printf("********************************************************\n");
}

// 返回主菜单
// msg 为提示语
void returnToMenu(char *msg){
    system("cls");
    printf("%s\n", msg);
    printf("按任意键回到主菜单...\n");
    // getch()读取用户输入的字符,无缓冲无回显
    // 可以优雅地实现让程序“暂停一下”的功能
    getch();
}

运行结果示例:

输入 a 或 A:

按任意键,又回到了上面的菜单(主菜单)。大家可以亲自演示一下这段代码,会有更加直观的动态效果。

上面的程序通过 while(1) 循环,不断执行用户操作,直到用户输入z退出系统。

这里有几点需要说明一下。

1) system() 函数位于stdlib.h头文件,用来执行dos命令,system("cls") 用来清屏,与dos里面的cls命令功能相同。

2) fflush() 函数用来刷新文件缓冲区,fflush(stdin) 用来刷新标准输入缓冲区。
这里为什么需要强制刷新缓冲区呢?

scanf("%c",&action); 读取字符时,按下回车键才能结束输入,这时的缓冲区中不仅有我们输入的字符,还有回车换行符(\n)。scanf() 第一次读取我们输入的字符,并将该字符移出缓冲区,但是换行符\n还留在了缓冲区,下次执行scanf()不会等待用户输入,而是直接从缓冲区读取内容,就是\n,然后将\n赋值给action,再通过switch来匹配,这显然不是我们想要的结果。大家可以把fflush(stdin);注释掉,再看看是什么效果。

3) getch() 位于conio.h头文件,用来读取一个字符,无缓冲区,无回显,所以按下任意键(输入一个字符),不会将该键对应的字符显示在屏幕上,也不会到达stdin缓冲区,可以优雅的实现按任意键继续的功能。

与 system("pause") 相比,getch() 没有提示语,如果需要,可以在前面使用printf()输出,实现“私人定制”。

来源: http://wz.jspi.cn/0162-news-zx18/142543226792857692.html