MacOS环境-手写操作系统-42-Cls清屏

文章介绍了如何在控制台环境中实现cls命令,这个命令用于清空控制台所有字符。首先,作者通过优化代码,实现了一个名为strcmp的函数来比较两个字符串,以提高代码灵活性。然后,详细展示了cls命令的实现过程,主要是将控制台显示区域的像素点设置为黑色,达到清除屏幕的效果。最后,提供了编译和运行的相关信息。

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

Cls

1.简介

上节 我们实现了控制台命令mem

它能显示当前可用内存

本节我们实现另一常用命令叫cls

该命令的作用是把控制台所以字符全部清空

2.代码

在实现该命令前 我们先实现一个辅助函数

我们判断控制台上输入的字符是否是一个合法命令 使用的是逐个字符匹配

例如判断是否输入了命令, “mem” 我们原来的做法是

if (cmdline[0] == 'm' && cmdline[1] == 'e' && cmdline[2] == 'm'
&& cmdline[3] == 0)

这种做法很不灵活 如果命令字符串含有多个字母 那么怎个if语句就得写得很长 这样的代码是很难维护的

所以 我们要实现一个函数strcmp 比较两个字符串

int strcmp(char *src, char *dest) {
    if (src == 0 || dest == 0) {
        return 0;
    }

    int i = 0;
    while (src[i] != 0 && dest[i] != 0) {
        if (src[i] != dest[i]) {
            return 0;
        }

        i++;
    }

    if (src[i] == 0 && dest[i] != 0) {
        return 0;
    }

    if (src[i] != 0 && dest[i] != 0) {
       return 0; 
    }

    return 1;
}

接下来我们要实现cls 命令

该命令的实现很简单 只要把控制台显示区域的所有像素点全部设置成黑色就可以了

代码如下

void console_task(struct SHEET *sheet, int memtotal) {

    struct TIMER *timer;
    struct TASK *task = task_now();
    int i, fifobuf[128], cursor_x = 16, cursor_c = COL8_000000;
    int cursor_y = 28;
    char  cmdline[30];
    int x = 0, y = 0;

    for(...) {
       ....
       else if (i == KEY_RETURN) {
                set_cursor(shtctl, sheet, cursor_x, cursor_y, COL8_000000);
                cmdline[cursor_x / 8 - 2] = 0;
                cursor_y = cons_newline(cursor_y, sheet); 
                if (strcmp(cmdline, "mem") == 1) {
                    char *s = intToHexStr(memtotal / (1024));
                    showString(shtctl,sheet,16,cursor_y,COL8_FFFFFF, "free ");
                    showString(shtctl,sheet,52,cursor_y, COL8_FFFFFF, s);
                    showString(shtctl, sheet, 126, cursor_y, COL8_FFFFFF, " KB");
                    cursor_y = cons_newline(cursor_y, sheet);
                } else if (strcmp(cmdline, "cls") == 1) {
                    for (y = 28; y < 28 + 128; y++)
                      for (x = 8; x < 8 + 240; x++) {
                          sheet->buf[x + y * sheet->bxsize] = COL8_000000;
                      }

                      sheet_refresh(shtctl, sheet, 8, 28, 8+240, 28+128);
                      cursor_y = 28;
                      showString(shtctl, sheet, 8, 28, COL8_FFFFFF, ">"); 
                }

                cursor_x = 16;
            }
       ....
    }
}

3.编译和运行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

武子康

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

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

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

打赏作者

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

抵扣说明:

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

余额充值