C语言中,制作菜单操作界面是很常见的,一般都是通过scanf("%d",&i) 与switch(i)搭配来使用,这种方法很基础,我近来发现另外一种比较不错的方法,容错处理也有,可拓展性也高:
#define BUFFERSIZE 256
enum login_register_status {_f_main_, _login_id_, _login_passwd_, _udpport_, _register_name_, _register_passwd_};
static struct
{
enum login_register_status status;
int buf_size; //从标准输入中获取的字节个数
int display; //根据需要,可以选择添加这个变量,控制显示设计
char *buf; //从标准输入获取的字节存放的位置,同buf_size一起使用
}f_menu;
static void init_f_menu() //初始化菜单
{
f_menu.status = _f_main_;
f_menu.display = 1;
f_menu.buf_size = BUFFERSIZE; //一次从标准输入获取的字节共个数
f_menu.buf = malloc(BUFFERSIZE);
}
//通过这个枚举形式,本质上主界面和子界面是同一等级
static void fun_f_menu()
{
if(_f_main_ == f_menu.status)
printf("1.登录 2.注册 3.退出\n"); //主界面
else if(_login_id_ == f_menu.status)
printf("请输入ID:\n"); //以下5个分级子界面,本质上和主界面同一等级
else if(_login_passwd_ == f_menu.status)
printf("请输入密码:\n");
else if(_udpport_ == f_menu.status)
printf("请输入监听的UDP端口\n");
else if(_register_name_ == f_menu.status)
printf("请输入姓名:\n");
else if(_register_passwd_ == f_menu.status)
printf("请输入密码:\n");
}
static void do_f_menu()
{
int nret;
scanf("%s", f_menu.buf);
//主界面的操作选项,通过从buf中获取的不同的数值,设置不同的f_menu.status,进行不同的操作
if(f_menu.status == _f_main_)
{
int num;
sscanf(f_menu.buf, "%d", &num);
if(1 == num)
f_menu.status = _login_id_;
else if(2 == num)
{
f_menu.status = _register_name_;
}
else if(3 == num)
{
exit(1);
}
else
{
printf("输入错误\n");
f_menu.status = _f_main_;
}
}
//根据不同status,来选择不同界面操作
else if(f_menu.status == _login_id_)
{
/* *** */
f_menu.status = *** //下一个界面
}
else if(f_menu.status == _login_passwd_)
{
/* *** */
f_menu.status = *** //下一个界面
}
else if(f_menu.status == _udpport_)
{
/* *** */
f_menu.status = *** //下一个界面
}
else if(f_menu.status == _register_name_)
{
/* *** */
f_menu.status = *** //下一个界面
}
else if(f_menu.status == _register_passwd_)
{
/* *** */
f_menu.status = *** //下一个界面
}
}