основная проблема в том, что вы используете 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);
}
хромает но будет работать :) 1027 *