C语言画菜单函数(只为方便手机端学习用户)

主要针对手机端初学者用户,重复画菜单不方便调节字符空格不方便居中显示等问题。
函数自动画菜单,边框字符自定义,宽高自定义,要显示的菜单写成数组,调用函数即可。
注意:输出字体默认16磅大小,其它大小可能有偏差。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

完整代码如下,仅供参考!


#include <stdio.h>
#include<string.h>
#include<wchar.h>
#include<locale.h>

int drawrect(unsigned int w,unsigned int h,char symbol ,char **menu);
int get_chsQty_ascQty(const char *strsrc,unsigned int *chs_n ,unsigned int *asc_n);

int main(int argc, char** argv)
{
    //首先设置要显示的菜单项数组,要几项自己且定,注意末尾项设置为"空"
    char *menu[]={
    "1->显示看看主菜单","2->五好打开某功能","3->显示某么好信息","4->哈嘎嘎哈哈哈喔","0->退出哟哟程序了","空"}
    ;
    //只需要调用一个函数即可自动建立菜单了
    //第一个参数边框宽(字节),第二个参数边框高(字节)
    //第三个参数是画边框所用的字符
    //注意控制台字体大小是16磅,其它大小显示可能会有差距
    drawrect(52,15,'#',menu);
    return 0;
}

//求出字符串中ascii字符个数以及中文字符个数
int get_chsQty_ascQty(const char *strsrc,unsigned int *chs_n ,unsigned int *asc_n)
{
    //设置字符集环境为中文。
    setlocale(LC_ALL, "zh_CN.UTF-8");
    //setlocale(LC_ALL, "chs");
    //原字串长度
    unsigned int slen=strlen(strsrc);
    if(slen>2048)return -1;
    wchar_t wstr[512]={
    0}
    ;
    mbstowcs(wstr,strsrc,slen);
    unsigned int wcs_n=wcslen(wstr);
    //初始化半角字符个数为0
    *asc_n=0;
    *chs_n=0;
    //初始化全角字符个数为0
    for(int i=0;i<wcs_n;i++)
    {
        if((unsigned int)(wstr[i])>255)
        {
            ++(*chs_n);
        }
        else
        {
            ++(*asc_n);
        }
    }
    return 0;
}

//手机默认长度42字节,高度15比较合适
//画边框单位符号只支持英文字母以及半角标点符号
int drawrect(unsigned int w,unsigned int h,char symbol,char **menu)
{
    int chs_n=0;
    //全角字符个数
    int asc_n=0;
    //半角字符个数
    int menulen;
    //菜单显示长度
    int menuwid;
    //菜单字串缩进宽度
    
    int menulen1;
    
    printf("\n");
    for(int i=0;i<w;i++)
    {
        printf("%c",symbol);
    }
    printf("\n");
    int j=0;
    for(int i=0;i<h;i++)
    {
        if(strcmp(menu[j],"空")!=0)
        {
            printf("%c",symbol);
            get_chsQty_ascQty(menu[j],&chs_n ,&asc_n);
            //显示出来看到的并非就是真实的。
            menulen=chs_n*3+asc_n;
            //参与计算项
            menulen1=chs_n*2+asc_n;
            menuwid=(w-menulen1)%2==0 ? menulen+(w-menulen1)/2-1 : menulen+(w-menulen1)/2 ;
            printf("%*s", menuwid,*(menu+j++));
            printf("%*c\n",(w-menulen1)/2,symbol);
        }
    }
    for(int i=0;i<w;i++)
    {
        printf("%c",symbol);
    }
    return 0;
}



  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滴水不穿石

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值