printf()函数的实现
Implementation of printf() function
我正在制作一个爱好者内核,我正在尝试实现一个 printf()
功能。
这是我的实现:
void kprint(uint8_t *format, ...) {
va_list ap;
va_start(ap, format);
uint8_t *ptr;
for (ptr = format; *ptr != '[=10=]'; 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!" 时,它 returns 我说:
"Hello %sllo %so %sWorld"
函数调用如下:
kprint("Hello %s", "World");
主要问题是您正在使用 puts
打印 字符串的其余部分 而不是当前字符。
} else {
puts(ptr, 0x0F, xPos, yPos);
ptr++;
}
你也在递增 ptr
当它已经在循环中完成时。对使用格式参数很有用,但在那种情况下没有用。
在标准系统(在 windows gcc 上测试)上工作的工作实现(不使用奇怪的 puts
原型):
#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 != '[=11=]'; 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] = '[=14=]';
puts(c, 0x0F, xPos, yPos);
}
蹩脚但会工作:)
void kprint(char *format, ...)
{
va_list ap;
va_start(ap, format);
char *ptr = format;
while(*ptr)
{
if (*ptr == '%')
{
ptr++;
switch (*ptr++)
{
case 's':
printf("%s", va_arg(ap, char *));
break;
}
}
else
{
putchar(*ptr++);
}
}
va_end(ap);
}
int main()
{
kprint("Hello %s World%s", "AAAAA", " BBBBBB");
return 0;
}
我正在制作一个爱好者内核,我正在尝试实现一个 printf()
功能。
这是我的实现:
void kprint(uint8_t *format, ...) {
va_list ap;
va_start(ap, format);
uint8_t *ptr;
for (ptr = format; *ptr != '[=10=]'; 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!" 时,它 returns 我说:
"Hello %sllo %so %sWorld"
函数调用如下:
kprint("Hello %s", "World");
主要问题是您正在使用 puts
打印 字符串的其余部分 而不是当前字符。
} else {
puts(ptr, 0x0F, xPos, yPos);
ptr++;
}
你也在递增 ptr
当它已经在循环中完成时。对使用格式参数很有用,但在那种情况下没有用。
在标准系统(在 windows gcc 上测试)上工作的工作实现(不使用奇怪的 puts
原型):
#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 != '[=11=]'; 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] = '[=14=]';
puts(c, 0x0F, xPos, yPos);
}
蹩脚但会工作:)
void kprint(char *format, ...)
{
va_list ap;
va_start(ap, format);
char *ptr = format;
while(*ptr)
{
if (*ptr == '%')
{
ptr++;
switch (*ptr++)
{
case 's':
printf("%s", va_arg(ap, char *));
break;
}
}
else
{
putchar(*ptr++);
}
}
va_end(ap);
}
int main()
{
kprint("Hello %s World%s", "AAAAA", " BBBBBB");
return 0;
}