C 언어에서 %n은 매우 특별한 형식 지정자(format specifier)입니다. 일반적인 형식 지정자와 달리 화면에 무언가를 출력하는 대신, 대응되는 인수가 가리키는 변수에 값을 저장합니다.
이때 저장되는 값은 %n이 등장하기 전까지 printf()가 출력한 문자의 총 개수입니다.
%n 사용 시 주의사항
%n 자체는 아무것도 출력하지 않습니다. 따라서 실제 문장을 화면에 표시하려면 별도의 printf() 함수 호출이 필요합니다.
예제 코드
#include<stdio.h>
int main() {
int s;
printf("The value of %ns : ", &s);
printf("%d", s);
getchar();
return 0;
}실행 결과
The value of s : 13
위 코드에서 변수 s에는 13이라는 값이 저장되었습니다. 이는 "The value of " 부분의 문자 13개가 출력된 후 %n이 만났기 때문입니다.
값을 직접 지정해도 무시된다
흥미로운 점은 해당 변수에 미리 값을 할당하더라도 프로그램은 그 값을 무시한다는 것입니다. %n은 오직 %n 앞에 출력된 문자 수만 계산하며, %n 자체는 문자 수에 포함되지 않습니다.
다음은 여러 개의 %n을 사용하여 값을 전달하는 경우의 예제입니다.
예제 코드
#include<stdio.h>
int main() {
int s;
int m = 28;
int val;
printf("The value of %ns and %nm %nval : ", &s, &m, &val);
printf("%d\t%d\t%d", s, m, val);
return 0;
}실행 결과
The value of s and m val : 131921
출력 결과를 보면 각 변수에 저장된 값은 다음과 같습니다.
- s = 13: 첫 번째 %n까지 출력된 문자 수
- m = 19: 두 번째 %n까지 출력된 문자 수
- val = 21: 세 번째 %n까지 출력된 문자 수
변수 m에 미리 할당한 값 28은 완전히 무시되고, %n 기준으로 누적된 문자 개수가 덮어써진 것을 확인할 수 있습니다.