printf()函数的实现

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)

Jea*_*bre 5

主要问题是您正在使用它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脚,但会工作:)