linux下的C程序,使用curses.h创建的基于控制台的应用程序

本文介绍如何使用Curses库创建一个简单的登录界面,并验证用户名和密码。演示了颜色设置、字符输入处理及窗口绘制等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用curses.h前先要确认是否已经成功安装这个库,方法为:

ls -l /usr/include/*curses.h
ls -l /usr/lib/lib*curses*

如果没有安装,则输入下面的命令进行安装:

yum -install *curses*

建立文件a.c,这段代码可以完成如下功能:输入用户名和密码,如果用户名和密码与tsybius和123456吻合,则弹出一个小对话框

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
#include <string.h>

void main()
{
    //初始化 curses.h
    initscr();

    //检查终端是否能正确显示颜色
    if (!has_colors())
    {
        endwin();
        fprintf(stderr, "终端不支持颜色显示\n");
        exit(1);
    }
    if (start_color() != OK)
    {
        endwin();
        fprintf(stderr, "无法初始化颜色\n");
        exit(2);
    }

    //绘制颜色
    move(0, 0);
    init_pair(1, COLOR_GREEN, COLOR_BLACK);
    attron(A_BOLD | COLOR_PAIR(1));
    printw("LINES:%d, COLUMNS:%d", LINES, COLS);
    attroff(A_BOLD | COLOR_PAIR(1));

    char username[100];
    char password[100];
    const char* pswd = "123456";

    int i;

    move(4, 5);
    printw("LOGIN FIRST!");
    move(5, 5);
    printw("USERNAME: ");
    refresh();

    cbreak(); //字符一经输入立刻通知程序
    noecho(); //取消回显
    memset(username, '\0', sizeof(username));

    i = 0;
    while (i < 100)
    {
        username[i] = getch();
        if (username[i] == '\n')
        {
            break;
        }
        else if (username[i] != '\b')
        {
            move(5, 15 + i);
            addch(username[i]);
            refresh();
            i++;
            continue;
        }
        else
        {
            //全部删除完,不继续删除
            if(i == 0)
            {
                continue;
            }

            move(5, 14 + i);
            addch(' ');
            move(5, 14 + i);
            refresh();
            i--;
        }
    }

    move(6, 5);
    printw("PASSWORD: ");
    refresh();

    memset(password, '\0', sizeof(password));

    //输入用户名
    i = 0;
    while (i < 100)
    {
        password[i] = getch();
        if (password[i] == '\n')
        {
            break;
        }
        else if (password[i] != '\b') //接到'\b'则删除前面的字符
        {
            move(6, 15 + i);
            addch('*');
            refresh();
            i++;
            continue;
        }
        else
        {
            //全部删除完,不继续删除
            if(i == 0)
            {
                continue;
            }

            move(6, 14 + i);
            addch(' ');
            move(6, 14 + i);
            refresh();
            i--;
        }
    }

    char temp[100];
    int a = 0;
    int b = 0;

    //检查输入:处理掉输入内容中的'\b'
    while(username[b] != '\0')
    {
        if(username[b] != '\b')
        {
            temp[a] = username[b];
            a++;
            b++;
        }
        else
        {
            a--;
            b++;
        }
        if (b >= strlen(username))
        {
            temp[a] = '\0';
            break;
        }
    }

    //比较输入的用户名与实际的用户名
    if (strncmp("tsybius", temp, 7) != 0 && temp[7] == '\0')
    {
        endwin();
        fprintf(stderr, "USER NOT FOUND: %s\n", username);
        exit(3);
    }

    //检查输入:处理掉输入内容中的'\b'
    a = 0;
    b = 0;
    while(password[b] != '\0')
    {
        if(password[b] != '\b')
        {
            temp[a] = password[b];
            a++;
            b++;
        }
        else
        {
            a--;
            b++;
        }
        if (b >= strlen(password))
        {
            temp[a] = '\0';
            break;
        }
    }

    //比较输入的密码与实际的密码
    if (strncmp(pswd, temp, strlen(pswd)) != 0 && temp[strlen(pswd)] == '\0')
    {
        endwin();
        fprintf(stderr, "INCORRECT PASSWORD\n");
        exit(4);
    }

    echo();     //打开回显
    nocbreak(); //模式切换

    //背景填充字符 'X'
    /*
    int x_loop;
    int y_loop;
    char a_letter = 'X';
    for (y_loop = 1; y_loop < LINES - 1; y_loop++)
    {
        for (x_loop = 0; x_loop < COLS - 1; x_loop++)
        {
            mvwaddch(stdscr, y_loop, x_loop, a_letter);
        }
    }
    */
    refresh();

    //绘制窗口
    WINDOW *new_window_ptr;
    new_window_ptr = newwin(20, 40, 8, 10);
    box(new_window_ptr, '|', '-');
    mvwprintw(new_window_ptr, 2, 13, "%s", "BUSINESS CARD");
    mvwprintw(new_window_ptr, 6, 8, "%s", "NAME:         TSYBIUS");
    mvwprintw(new_window_ptr, 10, 8, "%s", "GENDER:         MALE");
    mvwprintw(new_window_ptr, 14, 8, "%s", "AGE:             23");
    wrefresh(new_window_ptr);
    sleep(10);

    endwin(); //结束使用 curses.h
    exit(EXIT_SUCCESS);
}

输入下面的命令进行编译

gcc a.c -o a -lcurses

运行效果图

220506_gY8D_1425762.png

END

转载于:https://my.oschina.net/Tsybius2014/blog/318334

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值