我正在开发一个小型操作系统: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面或其他任何符号,我错了吗?
有关更多代码,请查看我的回购。