2016-06-02 3 views
-2

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 

example

+1

스택 오버 플로우에 오신 것을 환영합니다! 디버거를 사용하여 코드를 단계별로 실행하는 방법을 배워야 할 필요가있는 것 같습니다. 좋은 디버거를 사용하면 한 줄씩 프로그램을 실행하고 예상 한 곳에서 벗어난 곳을 볼 수 있습니다. 프로그래밍을 할 때 필수적인 도구입니다. 추가 읽기 : [작은 프로그램을 디버깅하는 방법] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+1

필드 폭에 대해 출력하는 문자는 세지 않습니다. 또한 음수를 제대로 처리하지 못하기 때문에 함수가 handle_d_i 대신 handle_u가됩니다. –

+1

또한 메모리 누수가 있습니다. 당신은'malloc'을 호출하고 결과를 결코 풀어 내지 못합니다. –

답변

3

당신은 번호를 작성하는,하지만 당신은 자리의 수를 뺀 너비 지정자 (i)에서 서명되지 않습니다.

0

난 숫자 (i)의 자릿수를 빼서 MSN에 의해 제안 된대로 해결할 수있었습니다.

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

    l_justfy = flags('-', f); 
    force_pos = flags('+', f); 
    i = atoi(f + (l_justfy + force_pos)); 
    num_digits = strlen(itoa(i)); 
    if (force_pos) 
     i = i - (num_digits + 1); 
    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); 
    } 
} 
관련 문제