gpt4 book ai didi

c - printf 在 c 中的实现,我的函数打印两个额外的空格

转载 作者:行者123 更新时间:2023-11-30 20:04:42 25 4
gpt4 key购买 nike

我正在尝试实现我自己的 printf 函数,我正在使用两个标志 -+ 测试我的代码,我的 handle_d_i() 函数打印另外两个不需要的空格。我在这里做错了什么?

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int str_contains(char c)
{
static char conversions[] = "sSpdDioOuUxXcC";
int i;

i = 0;
while (conversions[i])
{
if (c == conversions[i++])
return (1);
}
return (0);
}

void putnbr(int n)
{
if(n >= 10)
{
putnbr(n / 10);
putnbr(n % 10);
}
else
{
putchar(n + '0');
}
}

int flags(char flag, char *search)
{
while (*search)
{
if (*search == flag)
return (1);
search++;
}
return (0);
}

void handle_d_i(char *f, int d_i)
{
int i;
int l_justfy;
int force_pos;

l_justfy = flags('-', f);
force_pos = flags('+', f);
i = atoi(f + (l_justfy + force_pos));
if (l_justfy)
{
if (force_pos)
putchar('+');
putnbr(d_i);
while (--i > 0)
putchar(' ');
}
else
{
while (--i > 0)
putchar(' ');
if (force_pos)
putchar('+');
putnbr(d_i);
}
}

void my_printf(char *format, ...)
{
char *traverse;
va_list arg;
int i;
char *flags;

va_start(arg, format);
i = 0;
flags = malloc(strlen(format));
traverse = format;
while (*traverse)
{
if (*traverse == '%')
{
i = 0;
traverse++;
bzero(flags, strlen(flags));
while (!str_contains(*traverse))
flags[i++] = *traverse++;
if (*traverse == 'd' || *traverse == 'i')
handle_d_i(flags, va_arg(arg, int));
// handle more flags
}
else
putchar(*traverse);
traverse++;
}
va_end(arg);
}

int main(void)
{
my_printf("|%-+9d|%13d\n", 18,9 );
printf("|%-+9d|%13d", 18,9 );
return (0);
}

输出

|+18        |            9
|+18 | 9

example

最佳答案

您正在写出一个数字,但没有从宽度说明符 (i) 中减去位数和符号。

关于c - printf 在 c 中的实现,我的函数打印两个额外的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37603291/

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