C언어를 배울때면 맨처음 만나게 되는 함수가 printf() 함수입니다. 명령 프롬프트(터미널)상에 문자열을 출력하는 함수죠.

하지만 프로그래밍을 더욱 배우다 보면 printf()와 이름이 비슷한 함수들이 많은 것을 알 수 있습니다. 막상 printf()는 그다지 쓸일이 없어집니다.

그러면 이제 printf() 함수의 종류를 알아보도록 하겠습니다.

printf(): 표준 출력 함수입니다. 도스시절 부터 화면상에 문자열을 출력하는 함수입니다. 윈도우에서는 명령 프롬프트에 출력을 하게 됩니다(운영체제에 따라 시리얼 포트가 표준 출력으로 설정되어 있으면 모니터 화면이 아니라 시리얼 포트에 달린 터미널에 출력됩니다. 또는 임베디드 장비라면 소형 LCD 화면이 될 수도 있습니다).

fprintf(): 파일에 문자열을 쓰는 함수입니다. 첫번째 인자로 파일(FILE)의 포인터를 받습니다. 그리고 그 파일에 문자열을 씁니다.

sprintf(): 배열이나 포인터로된 버퍼에 문자열을 쓰는 함수입니다. 첫번째 인자로 버퍼의 포인터를 받습니다. 그리고 그 버퍼에 문자열을 씁니다.

vprintf(): 화면상에 문자열을 표시합니다. printf() 함수처럼 가변인자 함수가 아니라 인자의 갯수가 2개로 정해져 있습니다. 첫번째 인자는 출력 할 문자열(포맷)이고, 두번째 인자는 va_list를 받습니다. va_list는 va_start, va_end, va_arg 매크로를 사용하여 얻어와야 합니다.

printf() 계열 함수는 크게 4가지로 나눌 수 있고, 여기에 버퍼 길이를 지정해 줄 수 있는 nprintf() 함수가 있습니다. 그리고 s, f, v를 조합하여 여러가지 함수가 나옵니다.

이렇게해서 나온 변종들을 살펴 보면

snprintf: 버퍼에 문자열을 쓰고 버퍼 길이를 지정해 줄 수 있습니다. vfprintf: 파일에 문자열을 쓰고 va_list를 받습니다. vsprintf: 버퍼에 문자열을 쓰고 va_list를 받습니다. vsnprintf: 버퍼에 문자열을 쓰고 버퍼길이를 지정해 줄 수 있으며 va_list를 받습니다.

w가 붙은 함수가 있는데 이것은 wide character(wchar_t)를 받습니다. 유니코드를 처리할 때 사용합니다. wprintf(), fwprintf(), swprintf(), snwprintf(), vwprintf(), vswprintf(), vsnwprintf() 등이 있습니다.

t가 붙은 함수는 컴파일 옵션에 따라서 함수가 바뀝니다. tprintf() 함수는 전처리기(preprocessor) 옵션이 MBCS 일 경우 printf 함수가 사용되고 UNICODE일 경우 wprintf() 함수가 사용됩니다. tprintf(), ftprintf(), stprintf(), vtprintf() 등이 있습니다. 물론 n계열 함수도 모두 있습니다.

c가 붙은 함수는 콘솔(화면)에 바로 출력하는 함수입니다. 이 함수는 conio.h에 정의되어 있습니다. 일반 printf() 함수는 표준 출력 함수이고, cprintf() 함수는 비디오 메모리에 바로 출력하는 것입니다. 하지만 윈도우에 와서는 그다지 차이가 없습니다. cprintf(), scprintf(), vcprintf() 등이 있습니다. 이 함수들은 n계열은 없고, w계열 함수만 있습니다.

여기까지는 C 표준 함수들이고, 아래는 각 운영체제에서 지원하는 디버그 전용 printf() 함수들입니다. 이 디버그 전용 함수들은 윈도우의 경우 디버그(debug, checked) 모드에서만 프로그램에 포함되고, 릴리즈(release, free) 모드로 빌드 할 때에는 프로그램에 포함되지 않습니다(이것도 전처리기 옵션을 따릅니다).

DbgPrint(): 윈도우 커널 모드 드라이버에서 문자열을 출력하기 위해 사용하는 함수입니다. KdPrint()와 똑같은 함수입니다. (KdPrint()는 DbgPrint() 함수의 매크로입니다.) vDbgPrintEx()는 va_list를 받습니다.

printk(): 리눅스 커널에서 문자열을 화면이나 dmesg, syslog 등에 출력하는 함수입니다. 콘솔의 로그레벨에 따라서 출력이 될 수도 있고 안될 수 도 있습니다.

dprintf(): 유닉스 계열 운영체제에서 볼 수 있는 디버그 전용 함수입니다. 문자열을 화면에 출력할 수도 있고, 로그파일에 쓸 수도 있습니다. 함수로 구현된 것도 있고 매크로인 것도 있습니다. 유닉스 계열 함수는 워낙 제멋대로라서 형태는 여러가지입니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

29 March 2007