我的操作系统的printf功能

时间:2014-09-16 12:26:11

标签: c printf

我正在开发一个小型操作系统:https://github.com/MihaiPro/OS 我正在尝试创建一个printf函数,这是代码:

void printf(const char *str, ...)
{
    va_list formats;
    va_start(formats, str);

    char c, after;

    int tempI;

    int len;

    for (int i = 0; i < (int)strlen(str); ++i) {
        c = str[i];

        if (c == '%') {
            after = str[++i];

            if (after == 'd') {
                tempI = va_arg(formats, int);
                len = intlen(tempI);

                for (int x = len - 1; x >= 0; x--) {
                    int a1 = pow(10, x);
                    int a2 = tempI / a1;
                    int a3 = tempI / (a1 * 10);
                    t_putchar(STDK, (char)(a2 - a3 * 10));
                }   
            } else if (after == 'f') {
                    t_putchar(STDK, 'X');
            } else if (after == 'c') {
                t_putchar(STDK, (char)va_arg(formats, int)); // working
            } else {
                t_putchar(STDK, '%');
                --i;
            }
        } else {
            t_putchar(STDK, c); 
        }
    }

    va_end(formats);
}

现在,您可以使用其他一些功能:

size_t strlen(const char* str)
{
    size_t ret = 0;
    while ( str[ret] != 0 )
        ret++;
    return ret;
}

int intlen(int i)
{
    int ret = 0, r = 0;
    while (i != 0) {
        r = i % 10;
        i = (i - r) / 10;
        ++ret;
    }
    return ret;
}

int pow(int i, int p)
{
    int temp = p;
    while (temp > 0) {
        i *= i;
        --temp;
    }
    return i;
}

void t_mvcurs(struct terminal *Konsole)
{
    size_t pos = Konsole->row * 80 + Konsole->column;
    outb(0x3D4, 14);
    outb(0x3D5, pos >> 8);
    outb(0x3D4, 15);
    outb(0x3D5, pos);
}

现在,一些澄清:

STDK是标准的终端结构,它存储光标的位置和背景的颜色以及字符的颜色。

我的问题是:printf函数可以打印chars变量,但不能打印整数。我打印整数的伪代码是:

如果str中的当前char为'%',请检查下一个char是否为'd'。 如果下一个char是'd',我将当前变量的值存储到tempI中(为此我使用stdarg)。 在我获得数字len并获得每个数字并将其转换为char并打印它之后。我找到了如何在网上获得每个数字。但代码打印smipley面或其他任何符号,我错了吗?

有关更多代码,请查看我的回购。

0 个答案:

没有答案