이번에는 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 함수에 대해서 간단히 알아 보았습니다.


다음에는 반복실행을 명령하는 반복문에 대하여 공부하고 글을 올리도록 하겠습니다.








'프로그래밍 언어 > C' 카테고리의 다른 글

C언어 반복문 - while문(2)  (0) 2017.01.02
C언어 반복문 - while문(1)  (0) 2017.01.02
C언어 상수와 기본 자료형  (0) 2016.12.27
C언어 데이터 표현방식  (0) 2016.12.25
C언어 변수와 연산자  (0) 2016.12.24

+ Recent posts