gpt4 book ai didi

c - printf()函数的实现

转载 作者:行者123 更新时间:2023-12-01 09:12:54 25 4
gpt4 key购买 nike

我正在制作一个爱好者内核,我正在尝试实现 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 原型(prototype))(在 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);
}

蹩脚但会工作:)

关于c - printf()函数的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54352400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com