Taking baby-developer steps

2022.02.09. ft_printf() - 구현하기 본문

Logs/학습 log

2022.02.09. ft_printf() - 구현하기

Surin Lee 2022. 2. 9. 15:34

오늘 목표

  • ft_printf() 구현 고민
  • 초기 컨셉 코드 구현

오늘 한 일

  • ft_printf() 구현 고민
    • 이번 ft_printf()의 구현에 있어서 buffer management를 해서는 안된다는 금지 사항이 왜 들어갔을까를 더 고민하게 됬다.
    • 저번 과제였던 get_next_line에서는 시스템 콜인 read()의 호출을 최소화 해야한다는 사항이 있어서, 동적할당을 이용해 버퍼 메모리 관리를 했었는데, 그것과 관련이 있다고 생각한다. 이번 ft_printf()에서는 버퍼를 쓰지 못하게 하는 대신 시스템 콜의 호출을 많이 하게 하는 거고, 이를 통해 1circle에서 cpu 점유율이 높은 함수(많은 시스템 콜 / ft_printf)와 메모리 점유율이 높은 함수(buffersize에 맞는 메모리를 할당,해제 / get_next_line)를 각각 만들어보도록 유도하는 건가 하는 생각이 잠시 스쳤다. cpu 점유율이 높다는 것은 일반적으로 시간 복잡도가 커진다는 것이고, 메모리 점유율이 높다는 것은 공간 복잡도가 크다는 것이다. 즉 "시스템 콜을 많이 할까 vs 메모리 할당을 많이 할까"의 문제는 항상 때에 따라 선택할 수 밖에 없는 문제이다.
    • 메모리 할당을 할 필요가 없으니, 내가 느낄 때 문제에서 의도한다고 생각하는 방향대로 가려한다. -> 시스템 콜인 write()의 호출을 최대한 많이 하는 방향으로.
    • 덧붙여, printf()원형함수의 첫번째 인자에 의도적으로 에러를 일으키는 string을 넣었더니, 해당 에러를 일으키는 부분을 만났다고 해서 바로 에러메세지를 반환하며 종료되지 않고, 끝까지 다 출력하며 출력한 문자의 갯수도 끝까지 모두 센 것을 볼 수 있었다. 

printf() 원형 함수의 에러시 동작을 확인하기 전에 구상한 코드

이 에러 시 일단 모두 출력은 해내는 것을 보고, 원래는 check_valid()함수를 통해 들어온 str과 가변인자들이 valid한지를 먼저 검사하고 에러메세지 출력을 하려고 하였으나, 현재 목표는 printf()원형 함수의 구현이기 때문에, check_valid()부분 없이 구현해야겠다.

 

  • 초기 컨셉 코드 구현
    • 어느 순간 get_next_line()함수 구현 했던 방향으로 의식의 흐름(?) 이 이어졌는데, 그 방법을 이번 printf()과제 에서도 그대로 쓸 수 있을 것 같다. -> strchr()로 "%"와 같은 주요 기호 찾고 그걸 분기점 삼기
Comments