printf의 기능 중 몰랐던 것들을 정리한다.
1. Width field을 이용해 loop 없이 공백 입력하기
printf format 중 *는 폭을 지정하는데, 이를 이용해서 가변 길이의 공백을 loop문 없이 입력할 수 있다.
printf("%*c", n, ' '); <= 변수 n에 0보다 큰 값을 넣으면 그 만큼 공백을 넣는다.
유사하게 %*s를 이용해도 결과는 같다.
printf("%*s", n, " ");
2. Precision field
%.*s 는 최대 아웃풋 길이를 지정해줄 수 있다.
printf("%.*s", n, buf); <= buf를 출력하되, 최대 n 길이만큼만 출력한다.
3. %n
printf 의 형식 지정자 중 유일하게 화면에 출력하는 것이 아닌 parmeter로 받은 포인터에 "지금까지 출력한 문자 개수"를 입력한다.
printf("100%n", p); <= int* p에 지금까지 100 세 글자를 입력했으므로 3을 입력한다.
4. printf(변수명)
printf에 꼭 printf("문자열", 인수1, 인수2, ...) 이렇게 하지 않고 변수 하나만 넘길 수도 있다.
이때 변수에 format specifier (%d, %n)등을 이용하면 printf에 인자가 모자라게 되므로, 보안 문제가 발생하게 되니 유의한다.
참고한 링크
https://en.wikipedia.org/wiki/Printf_format_string#Width_field
https://stackoverflow.com/questions/25609437/print-number-of-spaces-using-printf-in-c
https://stackoverflow.com/questions/18526978/s-format-specifier-in-printf-statement-in-c
https://www.coursera.org/learn/software-security (3, 4번 항목)