printf함수는 문자열을 출력하는 함수이다. 큰 따옴표로 묶인 문자열을 전달하면서 printf 함수를 호출하면, 전달된 문자열이 모니터상에 출력된다.
int main(void)
{
printf("I like programming \n");
return 0;
}
그리고 문자열을 보면 \n이 삽입되어 있음을 알 수 있는데, 이를 가리켜 '특수문자'라고 한다.
특수문자 혹은 이스케이프 시퀀스라 불리는 문자들이 필요한 이유는 무엇일까?
printf("앞집 강아지가 말했다. "멍! 멍!" 정말 귀엽다.");
큰 따옴표의 시작과 끝을 문자열의 시작과 끝으로 보기 때문에 printf 함수 내에 삽입된 내용은 다음과 같이 해석이 된다.
" 앞집 강아지가 말했다." >> 하나의 문자열
멍! 멍! >> ?
"정말 귀엽다." >> 하나의 문자열
따라서 컴파일을 하면 여러 개의 에러가 발생한다.
이러한 유형의 문제를 해결하기 위해 문자열의 일부로 큰 따옴표를 포함시킬 수 있는 특수문자가 존재하는 것이다.
printf("앞집 강아지가 말했다. \"멍! 멍!\" 정말 귀엽다.");
이렇게 큰 따옴표 자체의 출력을 원하는 경우에는 큰 따옴표 앞에 \를 붙여준다.
printf의 f는 formatted(서식이 지정된)을 의미한다. 따라서 printf는 서식이 지정된 형태의 출력이라는 뜻이 담겨있다. 출력양식이 만들어진 상태에서 출력을 진행한다는 것이다.
int main(void)
{
int myAge = 12;
printf("제 나이는 10진수로 %d살, 16진수로 %X살입니다. \n", myAge, myAge);
return 0;
}
[실행결과]
제 나이는 10진수로 12살, 16진수로 C살입니다.
%d는 데이터를 10진수 정수의 형태로 출력한다는 의미이며, %X는 데이터를 16진수로 출력하되 알파벳은 대문자로 출력한다는 의미이다.
이렇듯 printf 함수를 이용해서 서식화 된 출력을 할 수 있는 이유는, 문자열 안에 서식문자를 포함할 수 있기 때문이다.
또한 printf 함수의 첫 번째 인자는 우리가 지정한 서식화된 문자열이다. 그 문자열 안에는 두 개의 서식문자가 포함되어있고, 이 서식문자의 출력대상이 두 번째 인자와 세 번째 인자이다. 즉, 첫 번째 서식문자의 출력대상이 두 번째 인자를 통해서 전달되며, 두 번째 서식문자의 출력대상이 세 번째 인자를 통해 전달된다.
이것이 printf 함수의 서식문자와 출력의 대상이 되는 데이터의 관계이다.
8진수와 16진수의 출력에 사용되는 %o와 %x를 이용해서는 양의 정수만 출력이 가능하다. 따라서 음의 정수를 출력하려면 반드시 %d를 사용해야 한다.
8진수와 16진수는 음의 정수 표현에 거의 사용되지 않는 표현법이라 양의 정수만 출력이 가능하도록 제한하고 있다.
%#o, %#x를 사용하면 8진수를 8진수처럼, 16진수를 16진수처럼 표현할 수 있다.
int main(void)
{
int num1 = 7;
printf("%o, %#o \n", num1, num1);
printf("%x %#x \n", num1, num1);
return 0;
}
[실행결과]
7 07
d 0xd
int main(void)
{
printf("%f \n", 0.1234);
printf("%e \n", 0.1234); //e 표기법 기반의 출력
printf("%f \n", 0.12345678);
printf("%e \n", 0.12345678); //e 표기법 기반의 출력
return 0;
}
[실행결과]
0.123400
1.234000e-001
0.123457
1.234568e-001
e표기법은 지수형태의 출력을 표현한 것이다. 프로그램상에서는 지수를 표현할 수 없기 때문에, e표기법을 사용하는 것이다.
%g는 소수점 이하의 자릿수가 늘어나면 e표기법으로 출력한다.
서식문자 %g는 실수의 형태에 따라서 %f와 %e 사이에서 적절한 형태의 출력을 진행한다.
%s에서의 s는 string의 약자로서 문자열의 출력을 지시하기 위한 서식문자에 사용된다.
int main(void)
{
printf("%s %s %s \n", "AAA", "BBB", "CCC");
return 0;
}
[실행결과]
AAA BBB CCC
서식문자에는 출력의 필드 폭을 지정하는 옵션을 추가할 수 있다. printf 함수는 명령 프롬포트상에서 출력하기 때문에, 보기 좋은 출력을 위해서 필드의 폭을 지정하는 것도 필요하다.
이렇듯 서식문자 사이에 들어가는 숫자를 기준으로 필드 폭이 결정되고, 출력의 형태는 기본적으로 오른쪽 정렬이기 때문에 -를 추가 삽입하면 왼쪽 정렬이 된다.
scanf 함수의 호출을 위해서는 입력의 형식과 입력의 장소 두 가지의 정보가 전달되어야 한다. 입력의 형식을 지정할 때도 pirntf함수와 마찬가지로 서식문자를 사용한다.
scanf 함수에서는 %f, %e, %g의 의미 모두 float형 데이터를 입력 받겠다는 의미이다.
double형은 %lf, long double형은 %Lf의 서식문자를 사용한다.
실수의 입력과정에서는 e표기법이 사용 가능하며, 서식문자 %s는 문자열의 입력에 사용된다.