brunch

매거진 Sinclair

You can make anything
by writing

C.S.Lewis

by Sinclair Feb 07. 2016

함수와 표준 I/O

내가 그의 이름을 불러 주었을 때 II




printf()와 scanf()함수의 모든 것


현재 거의 모든 프로그램에는 어떤 형태로든 입력 값과 출력 값이 존재합니다. 그 입출력 값을 처리하기 위해 대부분의 언어들이 기본적으로 입출력 함수들을 제공하고 있으며 그것을 보통 기본 Input, Output, 즉 I/O함수 라고 부릅니다. 하지만 말 그대로 기본 I/O이므로 기본적인 기능만을 제공합니다. 때문에 여러분들이 원하는 대로 작업을 하려면 여러분들만의 I/O함수들을 가지고 있어야 합니다. 게다가 입출력 장치가 바뀌게 되면 당연히 장치에 따른 I/O 함수들이 존재 해야 합니다. 우리는 여기서 표준 I/O함수들과 그 함수들의 문제점을 함께 살펴 보도록 하겠습니다. 이번 글타래에서 우리는 이차방정식의 근을 구하는 C프로그램을 작성해 볼 것입니다. 그러려면 정수형 3개를 입력 받고 근 2개를 출력해야 합니다. 입출력을 위해 우선 대표 표준I/O함수들인 printf()와 scanf()를 살펴 볼 것입니다. 그리고 간단한 함수를 만들어 보도록 하겠습니다.



printf() 함수의 프로토타입은 다음과 같습니다.  

int printf(const char *format, ...);  


우선 printf()와 같은 함수를 가변인자 함수라고 합니다.

보통 일반 함수들이 프로토타입에 적은 인자들과 같은 형태로 사용하여야 하는데 가변인자 함수들은 인자의 타입이나 개수에 상관없이 사용가능 하도록 해줍니다.

바로 ... 쩜쩜쩜? 이 쩜 세개가 그것을 가능하게 해 줍니다.

좀더 자세한 내용은 역시 void 포인터 부분에서 설명할 것 입니다. 우선은 포맷 문자열과 그 포맷 문자열에 맞는 인자를 적으면 그 인자를 표준 출력하는 함수라고 생각하면 됩니다.  


포맷 문자열은 %와 포맷 플래그 그리고 타입에 따른 문자들 순으로 구성이 됩니다.

사용하는 포멧 플래그 옵션들은 다음과 같습니다.       


-: 왼쪽 정렬로 출력합니다. 기본 정렬 방식은 오른쪽입니다.


+: 양수일 경우 양수 부호를 함께 출력합니다.


공백: 양수일 경우 공백이 음수일 경우 음수부호를 출력합니다


숫자: 자릿수를 지정할 수 있습니다. 지정 자릿수 보다 큰 숫자는 그대로 출력합니다. 소수점을 사용하면 실수의 출력되는 소수점 아래 자릿수를 지정할 수 있습니다. 전체자릿수, 또는 전체자릿수.소수점이하자릿수 와 같은 형대로 사용하지만 실수의 경우 .소수점이하자릿수와 같은 형태를 많이 사용합니다. 전체 자릿수에는 부호와 소수점도 포함됩니다.


0: 전체 자릿수의 앞에 남는 빈자리를 0으로 채웁니다. 왼쪽 정렬일 때는 동작하지 않습니다.



아래는 일반적으로 사용되는 printf() 함수의 포맷 문자열들입니다. 주의 할 것은 float형을 출력할 때나 double형을 출력할 때나 모두 %f, %g, %e 등을 사용합니다. %lf, %lg, %le가 따로 존재 하지 않습니다. 그러나 표준 C99에는 scanf()와 짝을 맞추는 의미로 포함시켰습니다.  




함께 사용하는 Escape 문자들




표준 입력 함수인 scanf()의 프로토타입은 다음과 같습니다.  


int scanf(const char *format, ... );  



printf()함수와는 다르게 반드시 인자의 주소 값을 사용해야 합니다. C언어는 call by value만을 지원하기 때문에 변수를 변경하려면 리턴 값을 사용해야 합니다 하지만 리턴 값은 오직 하나뿐이라고 설명했습니다. 인자는 여러 개의 값을 사용할 수 있지만 인자를 변경하려면 반드시 주소 값을 사용해야 합니다. 자세한 것은 이번 글 함수와 표준 I/O의 마지막에 함께 알아보도록 하겠습니다. 그리고 printf() 함수와는 달리 scanf() 함수의 경우 float형 데이터는 %f, %g, %e 등을 사용하고 double 형 데이터는 %lf, %lg, %le 등을 사용해야 합니다. double 데이터에 %f를 사용하거나 float 데이터를 %lf로 입력 받으면 제대로 된 값을 입력 받을 수 없습니다. 일반적으로 사용되는 scanf() 함수의 포맷 문자열들입니다.





굵은 폰트로 된 것을 주로 많이 사용합니다. 나머지 다른 것은 여러분들이 테스트해 보기 바랍니다. 제가 여기 작성할 수도 있지만 그렇게 하지 않겠습니다. 수없이 많은 책들 안에 그리고 ANSI 표준 문서에도 예제는 있지만 정작 우리의 기억 속에 남는 것은 우리들이 직접 사용한 것들 아닙니까? 부디 여러분들의 다양한 생각들을 동원해서 직접 작성해 보길 바랍니다. 다른 사람에 의해 작성된 것들을 눈으로 읽고 확인하면 두루뭉술하게 대충은 알 수 있겠지만 절대로 우리 것이 되질 않습니다. 많은 개발자들이 입을 모아 百聞이 不如一見이며, 百見이 不如一打라고 합니다. 경험이 지식을 지혜로 만듭니다.


그러나 믿음은 들음에서 난다고 했습니다.  










#Sinclair #씽클레어 #싱클레어 #씽클레어도씨 #씨언어 #씨프로그래밍  #C언어 #Cprogramming #C_Programming #C #Programming #Clanguage #C_Language

매거진의 이전글 함수와 표준 I/O
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari