【发布时间】:2019-01-24 17:33:43
【问题描述】:
我正在制作一个爱好者内核,我正在尝试实现一个printf() 函数。
这是我的实现:
void kprint(uint8_t *format, ...) {
va_list ap;
va_start(ap, format);
uint8_t *ptr;
for (ptr = format; *ptr != '\0'; ptr++) {
if (*ptr == '%') {
ptr++;
switch (*ptr) {
case 's':
puts(va_arg(ap, uint8_t *), 0x0F, xPos, yPos);
break;
}
} else {
puts(ptr, 0x0F, xPos, yPos);
ptr++;
}
}
va_end(ap);
}
当我想打印“Hello World!”时使用这个函数它返回给我:
"Hello %sllo %so %sWorld"
这里是函数调用:
kprint("Hello %s", "World");
【问题讨论】:
-
似乎您在没有遇到
%时将ptr增加了两次。另外,不要忘记将%%视为% -
您是否尝试将其作为简单用户模式程序的一部分进行调试?
-
还
puts打印字符串的剩余部分。你需要putc(*ptr) -
@Jean-FrançoisFabre 我删除了指针递增并在 else 块中用 putc() 替换了 puts(),但现在它只打印给定的参数。
-
puts(va_arg(ap, uint8_t *), 0x0F, xPos, yPos);这行不通。它使xpos和ypos的值错误(即未改变)。
标签: c operating-system osdev