이번에는 printf 함수와 scanf 함수에서 사용하는 서식문자에 대해서 알아 보도록 하겠습니다.
1. 특수문자 출력
printf 함수는 문자열을 출력하는 함수입니다.
문자열을 출력할 때 큰 따옴표(" ")로 묶인 문자열을 전달하고, printf 함수를 실행(호출)하면 전달된 문자열이 모니터상에 출력이 됩니다.
위 사진과 같이 큰 따옴표(" ")로 묶인 문자열이 출력 되는 것을 확인 할 수 있습니다.
이 때 이러한 생각이 들 수 있습니다.
철수가 말했습니다. "안녕 나는 철수라고 해." 라는 문장을 출력하고 싶은데 어떻게 어떻게 해야 되지? 라고 생각을 가질 수가 있습니다.
그래서 다음과 같이 문장을 작성 하시는 경우가 생길 수 있습니다.
일반적으로 사람이 볼 때는 "철수가 말했습니다. "안녕 나는 철수라고 해."" 라고 문장을 작성하게 되면 "안녕 나는 철수라고 해." 부분이 철수가 말하는 내용으로 출력이 되서 결과가 나와야 된다고 쉽게 생각을 할 수 있습니다.
하지만 컴퓨터는 처음 시작하는 큰 따옴표(" ")와 해당 큰 따옴표(" ")와 짝이 맞는 큰 따옴표(" ")를 찾아서 하나의 문장으로 인식 하기 때문에 에러가 위와 같은 경우가 발생하게 됩니다.
이러한 경우 다음과 같은 방법으로 해결할 수 있습니다.
이와 같이 큰 따옴표(" ")와 같은 문자를 직접 출력하고 싶을 경우 해당 따옴표 앞에 역슬래시(\)를 입력해주면 해당 문자가 직접 출력이 됩니다.
이렇듯 위의 예제에서 사용된 역슬래시(\)와 같은 문자를 특수문자라 합니다.
다음은 특수문자의 종류와 각 특수문자가 의미하는 내용을 나타낸 표입니다.
특수문자 |
의미하는 바 |
\a |
경고음 |
\b |
백스페이스(backspace) |
\f |
폼 피드(form feed) |
\n |
개 행(new line) |
\r |
캐리지 리턴(carriage return) |
\t |
수평 탭 |
\v |
수직 탭 |
\' |
작은 따옴표 출력 |
\" |
큰 따옴표 출력 |
\? |
물음표 출력 |
\\ |
역슬래시 출력 |
이 때 \f와 \v는 모니터 출력이 아닌 '프린터 출력'을 위해 정의된 특수문자이기 때문에 모니터의 출력에 사용하게되면, 이상한 문자가 출력 됩니다.
2. printf 함수의 서식지정과 서식문자들
%d %X와 같은 서식문자를 이용해서 출력할 문자열의 형태를 직접 지정할 수 있습니다.
위의 예제에서 보시는 것과 같이 myAge라는 변수에 저장 되더 있는 정수 12를 서식문자인 %d(10진수 형태로 출력), %X(16진수 형태로 출력)를 사용해 출력 형태를 직접 지정하여 출력한 결과 지정한 형태대로 출력이 되는 것을 확인 할 수 있습니다.
다음은 서식문자의 종류와 그 의미를 나타내는 표입니다.
서식문자 |
출력 대상(자료형) |
출력 형태 |
%d |
char, short, int |
부호 있는 10진수 정수 |
%ld |
long |
부호 있는 10진수 정수 |
%lld |
long long |
부호 있는 10진수 정수 |
%u |
unsigned int |
부호 없는 10진수 정수 |
%o |
unsigned int |
부호 없는 8진수 정수 |
%x, %X |
unsigned int |
부호 없는 16진수 정수 |
%f |
float, double |
10진수 방식의 부동소수점 실수 |
%Lf |
long double |
10진수 방식의 부동소수점 실수 |
%e, %E |
float, double |
e 또는 E 방식의 부동소수점 실수 |
%g, %G |
float, double |
값에 따라 %f와 %e 사이에서 선택 |
%c |
char, short, int |
값에 대응하는 문자 |
%s |
char * |
문자열 |
%p |
void * |
포인터의 주소 값 |
* 위의 표에서 %s와 %p에 대해서는 추후 포인터와 배열을 다루면서 추가적으로 설명하도록 하겠습니다.
* 정수의 출력을 위한 서식문자들 중 %x, %o의 경우 출력한 결과 문자인지 숫자인지 헷갈리는 경우가 발생합니다. 이 때 사용해주느 것이 #을 사용하는 것인데 이와 관련해서 다음의 예제를 보고 추가 설명을 하도록 하겠습니다.
위의 예제에서 서식문자를 활용하여 num1과 num2에 저장되어 있는 정수인 7, 13을 각각 8진수와 16진수로 출력을 한 결과입니다.
이 때 8진수와 16진수로 출력을 했어도 단순하게 생각하고 보면 '7은 10진수 7이구나, d는 문자 d 이구나' 라고 생각을 할 수도 있게 됩니다.
그래서 사용해주는 것이 %와 출력형태인 o, x 사이에 #을 넣어주는 것입니다.
#을 넣어주게 될 경우 위와 같이 7 앞에 8진수를 나타내는 0이 붙어서 출력이 되고, d 앞에 16진수를 나타내는 0x가 붙어서 출력이 되는 것을 확인 할 수 있습니다.
3. 실수의 출력을 위한 서식문자들 : %f, %e
실수의 출력은 %f를 주로 사용하지만 '지수'를 사용한 실수를 출력할 때에 어떻게 출력해야 되는지 생각을 하게 됩니다.
이와 관련하여 컴퓨터는 지수를 표현할 수 없으므로 e 표기법으로 지수를 대신 표현하게 됩니다.
10의 n승을 기준으로 나타내게 되는데, 이 때 10을 e로 표현하고 지수인 n을 e뒤에 붙여서 출력하게 됩니다.
다음의 예제를 통해 알아보도록 하겠습니다.
위의 예제와 같이 %f의 사용 결과와 %e의 사용 결과를 알 수가 있었습니다. %e의 사용에 관한 내용은 다음 주제에서 추가적으로 다루도록 하겠습니다.
4. %g의 실수출력
서식문자 %g의 실수출력과 관련해서 다음의 예제를 먼저 보고 진행하도록 하겠습니다.
%g의 실수출력과 관련해서 위의 예제의 결과를 통해 알 수 있는 것은 서식문자 %g는 %f와 %e 표기 중 적절한 것을 사용해서 출력한다는 것입니다.
%g를 사용한 결과 d1과 d2의 경우 소수점 이하 자릿수가 너무 많지 않고 충분히 알 수 있을 정도의 자릿수여서 0.00123, 0.000123 그대로 출력이 되는 반면, d3와 d4의 경우 소숫점 이하 자릿수가 많아져서 읽을 때 불편함이 발생하게 됩니다.
따라서 컴퓨터는 %g를 사용한 결과 d3와 d4는 %e를 사용해서 e 표기법으로 출력을 한 것을 확인 할 수 있습니다.
5. scanf 함수
1) scaf 함수에서 정수 기반의 입력형태를 정의하기
데이터를 입력 할 때 scanf 함수에세 전달해야 하는 두 가지 정보는 다음과 같습니다.
- 입력의 형식
- 입력 장소
이 두 가지 정보를 바탕으로 scanf 함수에게 데이터를 전달해야 합니다.
다음의 예제를 보도록 하겠습니다.
위의 예제에서 scanf 전달되어지는 데이터에 대해서 알 수 있습니다.
%d(10진수 정수) 형태, %o(8진수 정수) 형태, %x(16진수 정수) 형태로 데이터를 입력 받습니다.
* printf와 달리 저장 되어 지는 곳을 정해 줄 때 printf 함수 처럼 그냥 변수로 사용하면 될텐데 왜 변수 앞에 &를 붙이지? 라는 생각을 가지실 수 있는데 이와 관련해서는 포인터와 배열을 다루면서 추가적으로 설명하도록 하겠습니다.
6. 실수 기반의 입력형태 정의
printf 함수에서는 서식문자 %f, %e 그리고 %g의 의미가 각각 달랐습니다.
하지만 scanf 함수에서는 'float형 데이터를 입력 받겠다' 라는 말은 동일한 의미를 담고 있습니다.
scanf 에서의 %f %e %g는 float형 데이터의 삽입을 위한 서식문자 일 뿐입니다.
다음의 예제를 보고 진행하도록 하겠습니다.
printf 함수에서는 double형과 float형 모두 %f를 사용했습니다.
하지만 scanf 함수에서는 입력되는 자료형을 정확히 구분 해 줄 필요가 있습니다.(printf 함수의 경우 이미 저장되어 있거나 지정한 값들을 출력하는 것이기 때문에 상관이 없지만 scanf 함수의 경우 입력을 하는 것이기 때문에 정확하게 구분 해 줄 필요가 있습니다.)
다음은 scanf 함수에서 사용되어지는 서식문자를 나타낸 표입니다.
서식 문자 |
입력 받는 자료형 |
%f |
float 형 |
%lf |
double 형 |
%Lf |
long double 형 |
위의 표와 같이 정확하게 구분을 해줘야 합니다.
또한 double 형과 long double 형의 입력에 있어서 사용되는 서식 문자인 %lf 와 %Lf의 L의 대,소문자 또한 확실히 구분을 해주셔야 합니다.
printf 함수와 scanf 함수에 대해서 간단히 알아 보았습니다.
다음에는 반복실행을 명령하는 반복문에 대하여 공부하고 글을 올리도록 하겠습니다.