gpt4 book ai didi

c - 为什么我的程序的输出包含额外的换行符?

转载 作者:行者123 更新时间:2023-11-30 16:18:23 26 4
gpt4 key购买 nike

我正在尝试简单地实现 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*)) 行更改为 write(1, va_​​arg(args, char*), 6);产生预期的行为。这是 write 和 printf 之间交互的问题吗?

编辑2:

请参阅下面的答案!

最佳答案

@Achal 为我指出了有关 printf 中缓冲的正确方向。据我所知,根据这个stack overflow post ,除非满足一些条件,否则 printf 不保证打印到控制台。其中一些是 fflush、程序退出或换行符。

就我而言,该函数将每个字符写入标准输出(写入未缓冲),当遇到“%s\n”时,printf 正在执行其工作,只是它被缓冲了。所以我的假设是,当“\n”写入标准输出时, printf 意识到它需要转储其缓冲区,并且只有在 write 放下换行符之后才会这样做。

正如 @M.M 所提到的,混合 write 和 printf 并不是一个好主意,我想这篇文章证明了这一点。不过,我并不打算这样结束,因为我很懒,我只是使用 printf 进行测试,但我最终了解了更多关于它是如何工作的。干杯。

关于c - 为什么我的程序的输出包含额外的换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55913924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com