msk*_*msk 2 c operating-system osdev
我正在制作一个业余爱好者内核,并且正在尝试实现一个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);
}
Run Code Online (Sandbox Code Playgroud)
当我要打印“ Hello World!”时 使用此功能,它返回我:
"Hello %sllo %so %sWorld"
Run Code Online (Sandbox Code Playgroud)
这是函数调用:
kprint("Hello %s", "World");
Run Code Online (Sandbox Code Playgroud)
主要问题是您正在使用它puts来打印字符串的其余部分,而不是当前的char。
} else {
puts(ptr, 0x0F, xPos, yPos);
ptr++;
}
Run Code Online (Sandbox Code Playgroud)
ptr当循环中已经完成时,您也在增加。消耗format参数很有用,但在这种情况下则无效。
puts在标准系统(在Windows gcc上测试)上工作的有效实现(不使用奇怪的原型):
#include <stdio.h>
#include <stdint.h>
#include <stdarg.h>
void zprintf(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':
fputs(va_arg(ap, uint8_t *),stdout);
break;
case '%':
putchar('%');
break;
}
} else {
putchar(*ptr);
}
}
va_end(ap);
}
int main(){
zprintf("%% Hello %s\n","World");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
印刷品:
% Hello World
Run Code Online (Sandbox Code Playgroud)
(作为奖励,此实现可处理转义的%字符)
仅使用您的特殊实现puts即可更改
} else {
puts(ptr, 0x0F, xPos, yPos);
ptr++;
}
Run Code Online (Sandbox Code Playgroud)
工作:
} else {
char c[2];
c[0] = *ptr; c[1] = '\0';
puts(c, 0x0F, xPos, yPos);
}
Run Code Online (Sandbox Code Playgroud)
me脚,但会工作:)
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |