ft_printf_4일차

아따맘마·2020년 11월 13일
0

ft_printf

목록 보기
5/9

고민된 부분

어제 학습한 것을 기반으로 코딩을 하다가 고민에 빠졌다.

형식지정자에서 우선 flag의 유효성을 알아보기 위해 위와 같이 코딩을 했다.

  • 여기서 고민된 부분
  1. 먼저 flag가 유효하면 해당 옵션을 먼저 수행하고 서식지정자에 맞는 인자를 출력하려고 했다. 근데 하다보니까 형식지정자를 먼저 출력하는게 맞나 싶다. 0같은 경우에는 폭의 남은 부분을 0으로 채우는 옵션인데 현재 시점에서는 출력 인자의 길이를 모르기 때문이다.
  2. 위와 같이 짜면 형식지정자를 위해 만든 구조체 변수를 쓸 곳이 없다. 즉 사이즈 말고는 구조체 안에 들어갈 변수가 사라지지 않을까??하는 의문이 들었다.
  • 결론
    일단 먼저 이렇게 짜보고 아니다 싶으면 빠르게 갈아엎는게 맞는것 같다.

width

형식지정자에서 width를 처리해줄 때 두가지 경우가 있다.
1. *로 width를 지정해줄 때
-> va_arg로 ap 리스트를 int만큼 넘겨줌으로써 두번째 인자를 width 변수로 넘긴다.

va_arg로 가변인자를 넘겨줄 때 정수는 int, 실수는 double로 넘겨준다.
gcc를 이용한 컴파일은 가변인자가 int 보다 작으면 int로 (char, short = int)
float는 double로 넘겨준다.

  1. 숫자로 받을 때
    만약 %123d 처럼 숫자로 받으면 해당 숫자만큼 폭을 만들어줘야 한다.
    이 때 이용할 함수를 따로 만들어줬다.

is_num()

매개변수로는 이중포인터 문자형을 받았다.

숫자가 한자리수라는 보장이 없기 때문에 char을 매개변수로 받지 않고 char **로 하여금 문자열을 받았다.

  • 과정
  1. is_num() 내부에서 char *tmp 변수를 만든다.
  2. tmp 변수를 ft_strdup("")를 이용하여 빈 문자열을 duplicate한다.
  3. format가 숫자면 ft_strjoin()을 통해 tmp 변수에 이어 붙여준다.
  4. 숫자가 아니라면 해당 명령을 종료하고 tmp에 저장된 문자열 숫자를 ft_atoi()를 통해 숫자로 변환
  5. tmp 반환!!

생각지도 못했던 것인데 width를 바로 숫자로 받으면 음수를 신경 안써줘도 되지만, *를 통해 받게 된다면 인자에 음수값이 들어갈 수도 있다. 그러면 -부호는 flag에서 -옵션처럼 처리하고 width엔 양수로 변환하여 넣어주면 된다.

profile
늦게 출발했지만 꾸준히 달려서 도착지점에 무사히 도달하자

0개의 댓글