Я пытаюсь сделать наивную реализацию стандартной функции C printf .До сих пор я только что написал некоторый тестовый код, чтобы помочь мне лучше понять использование списков переменных аргументов.Однако я не знаю, почему мой вывод содержит дополнительную строку.
Вот мой код:
#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>
void print_test_helper(char *string, va_list args)
{
while (*string)
{
if (*string == '%')
{
string = string + 2; //increment pointer by two spots to "\n"
printf("%s", (va_arg(args, char*)));
}
else
{
write(1, &*string, 1);
string++;
}
}
}
void print_test(char *string, ...)
{
va_list ap;
va_start(ap, string);
print_test_helper(string, ap);
}
int main()
{
print_test("this is a %s\n", "string");
return 0;
}
Как я вижу, мой print_test_helper должен продолжать записывать строку, переданную вдо тех пор, пока не увидит символ «%», после чего он пропускает две точки символа новой строки.Затем функция вызывает метод printf, чтобы просто распечатать аргумент, содержащийся в списке, но вывод выглядит так:
this is a
string
Как видите, он содержит новую строку.Есть идеи, почему?
Редактировать:
изменение строки printf ("% s", va_arg (args, char *)) для записи (1, va_arg (args, char *), 6);производит ожидаемое поведение.Это проблема взаимодействия между write и printf?
Edit 2:
Смотрите ответ ниже!