C语言操作界面菜单思考

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 = ***       //下一个界面
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值