Почему вывод моей программы содержит дополнительный перевод строки? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь сделать наивную реализацию стандартной функции 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:

Смотрите ответ ниже!

1 Ответ

0 голосов
/ 30 апреля 2019

@ Ахал указал мне правильное направление буферизации в принтф. Насколько я могу судить по этому сообщению переполнения стека , printf не гарантирует печать на консоль, если не выполнено несколько условий. Некоторые из них, а именно: fflush, выход из программы или перевод строки.

В моем случае функция записывала каждый символ в стандартный вывод (запись не буферизована), и когда он обнаружил «% s \ n», printf выполнял свою работу, только он был буферизован. Таким образом, я предполагаю, что когда «\ n» записывается в стандартный вывод, printf понимает, что ему нужно выгрузить свой буфер, и делает это только после того, как write запустит перевод строки.

Как уже упоминалось @MM, не очень хорошая идея смешивать write и printf, и я думаю, что этот пост является свидетельством этого. Я не собирался так закончить, я просто использовал printf для тестирования, так как мне было лень, но я узнал больше о том, как это работает. Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...