gpt4 book ai didi

c - 如何像 printf 在 while 循环中打印字符一样打印字符?

转载 作者:行者123 更新时间:2023-11-30 14:54:07 25 4
gpt4 key购买 nike

我正在尝试复制 printf,但是我无法弄清楚如何让我的行为与 printfwhile 中的行为相同循环。

这是我正在使用的while循环:

while (i-- > 0) {
ft_printf("myprintf");
ft_putchar('\n');
printf("realprintf");
ft_putchar('\n');
}

这是结果

myprintf

myprintf

myprintf

myprintf

myprintf

myprintf

myprintf

myprintf

myprintf

myprintf

realprintfrealprintfrealprintfrealprintfrealprintfrealprintfrealprintfrealprintfrealprintfrealprintf%

这是我当前的printf,我相对较新,因此代码可能非常糟糕且效率低下,对此的评论将不胜感激

int ft_printf(const char *orgstr, ...)
{
va_list args;
char flagprefix;
int i;

flagprefix = '%';
i = 0;
while(orgstr[i])
{
va_start(args, orgstr);
if(orgstr[i] == flagprefix)
flag_handler(orgstr[i++], args);
else
ft_putchar(orgstr[i]);
i++;
va_end(args);
}
return (0);
}

flag_handler 函数尚未完成,但我给出的示例无论如何都不会调用该函数。

最佳答案

您观察到的问题来自于 ft_putchar() 和真正的 printf() 使用的不同缓冲机制。您可以通过在 ft_printf() 的开头和结尾处或在 while 循环中的调用之间刷新 stdout 来解决此问题:

while (i-- > 0) {
fflush(stdout);
ft_printf("myprintf");
ft_putchar('\n');
fflush(stdout);
printf("realprintf");
fflush(stdout);
ft_putchar('\n');
fflush(stdout);
}

请注意,您的 ft_printf() 函数框架存在问题:

  • 您应该在循环开始之前使用 va_start 初始化 args 一次,而不是针对格式字符串中的每个字符。
  • 如果将 va_list 传递给 flag_handler 函数,其副作用可能不会反射(reflect)回调用方。您应该直接在 ft_printf() 函数中从变量参数列表中提取参数。

这是修改后的版本:

int ft_printf(const char *orgstr, ...) {
va_list args;
int i, c;

va_start(args, orgstr);
i = 0;
while ((c = orgstr[i++]) != '\0') {
if (c == '%') {
switch (c = orgstr[i++])) {
case 's':
ft_putstr(va_arg(args, char *));
continue;
/* ... handle other cases ... */
case '\0':
break;
default:
ft_putchar(c);
continue;
}
break;
} else {
ft_putchar(c);
}
}
va_end(args);
return 0;
}

关于c - 如何像 printf 在 while 循环中打印字符一样打印字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46899247/

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