printf
함수를 구현하려고하는데 두 개의 플래그 -+
을 사용하여 코드를 테스트하고 있습니다. handle_d_i()
함수는 두 개의 불필요한 공백을 더 많이 인쇄합니다. 여기서 내가 뭘 잘못하고 있니?C에서 printf 구현이 두 개의 여분의 공백을 출력합니다.
#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);
}
OUTPUT
|+18 | 9
|+18 | 9
스택 오버 플로우에 오신 것을 환영합니다! 디버거를 사용하여 코드를 단계별로 실행하는 방법을 배워야 할 필요가있는 것 같습니다. 좋은 디버거를 사용하면 한 줄씩 프로그램을 실행하고 예상 한 곳에서 벗어난 곳을 볼 수 있습니다. 프로그래밍을 할 때 필수적인 도구입니다. 추가 읽기 : [작은 프로그램을 디버깅하는 방법] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –
필드 폭에 대해 출력하는 문자는 세지 않습니다. 또한 음수를 제대로 처리하지 못하기 때문에 함수가 handle_d_i 대신 handle_u가됩니다. –
또한 메모리 누수가 있습니다. 당신은'malloc'을 호출하고 결과를 결코 풀어 내지 못합니다. –