c - printf()函数的实现
问题描述
我正在制作一个爱好者内核,并且正在尝试实现一个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");
解决方案
主要问题是您puts
用于打印字符串的其余部分而不是当前字符。
} else {
puts(ptr, 0x0F, xPos, yPos);
ptr++;
}
ptr
当它已经在循环中完成时,你也在增加。使用格式参数很有用,但在这种情况下不是。
在标准系统上工作的工作实现(不使用奇怪的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;
}
印刷:
% Hello World
(作为奖励,此实现处理转义%
字符)
仅使用您的特殊实现puts
可以改变
} else {
puts(ptr, 0x0F, xPos, yPos);
ptr++;
}
到工作:
} else {
char c[2];
c[0] = *ptr; c[1] = '\0';
puts(c, 0x0F, xPos, yPos);
}
蹩脚但会工作:)
推荐阅读
- flutter - Objectbox dart:如何根据 ToOne 关系进行过滤?
- python - 有人能说如何显示自定义对话框以打印在 odoo 或 python 中成功验证的帐户吗?
- html - 我想从 Flutter 中的网站 URL 获取图像
- push-notification - 反应原生推送通知 + Jitsi 满足问题(Android)
- rust - 网络服务器仅从 http://localhost:8000 启动
- android - 在 branch.io 仪表板中找不到推荐部分?
- excel - 如果另一个单元格包含 Excel 中的特定文本,则在一个单元格中生成一个值
- reactjs - 如何在 heroku 应用程序中监控网站点击量?
- python - python中的测试用例执行
- python - 预期类型'Union[type, Tuple[Union[type, Tuple[Any, ...]], ...]]',得到'Tuple[ImgDirs, ImgDirs, ImgDirs]'