#5. 화면 출력함수

2009. 8. 21. 15:22STUDY !/배워보자 C언어


출력함수에는 여러가지가 있다.
printf()
putchar()
putche()
putch()
putc()
puts()
...

등등 굉장히 많은 함수가 있다.

그중에서 화면 출력함수에 대해서 알아보자.

  putc()  [ int putc(int c, FILE *stream) ]  in stdio.h
  Put character, 그러니까 한 문자를 출력하는 함수이다. 이 함수는 출력에 있어서 가장 기초적인 함수라고 할 수 있다.
  첫번째 인자 : 출력할 문자
  두번째 인자 : 출력할 위치
  두번째 인자에서 스트림(stream)의 개념이 나오는데, 이것은 본인도 아직 확실하게 모른다. 다만, 파일 포인터를 집어 넣으면 파일에 출력이 되고, stdout을 입력하면 화면에 출력된다는 것만 알고 있다. 나중에 알게되면 알려드리리다. 일단은 화면출력에 대해서 하고 있으니 거기에 초점을 맞추어보자.

Ex)
{
1  char ch = 'c';       //문자형변수 ch를 선언함과 동시에 c라는 문자로 초기화 했다.
2  putc(ch, stdout);  //함수의 인자로 ch라는 변수를 사용하고 출력 위치는 표준출력이다.
3  putc('c', stdout);  // 함수의 인자로 c라는 문자를 사용했고, 출력 위치는 표준출력이다.
}

  이러면 화면에 cc라는 문자가 출력될 것이다. 확인해보아라.
  모든 함수의  인자에는 변수가 들어갈 수도 있고, 상수가 들어갈 수도 있다.
/* C언어에서는 문자와 문장을 엄격하게 구분한다. 작은 따옴표( ' ' ) 안에 있는 것은 문자로 인식을 하고, 큰 따옴표( " " ) 안에 있는 내용물은 문장으로 인식한다. 예를 들어 "c"라는 표현을 썼다고 한다면, C는 하나의 문자가 아닌 문장으로 인식된다.
  만약, 작은 따옴표 안에 여러개의 문자를 집어 넣을 경우, 그 문자가 5개 이상인 경우에는 오류가 발생하고, 5개 미만인 경우에는 마지막에 입력한 문자가 출력된다. */


  putchar()
  [ int putchar (int character) ]  in stdio.h
  이 함수는 stdio헤더 파일에 매크로로 정의되어 있다.
#define putchar(c) putc((c),stdout)
  즉, putc함수를 표준출력으로만 이용할 수 있게 만든 것이다. int형 함수이기 때문에, 이 함수는 문자 c를 되돌주고(리턴), 에러가 발생하면 EOF(-1)을 리턴한다. 문자를 다루는 함수이지만 int형이 사용된 이유는 확실히는 잘 모르지만, int형의 연산이 가장 빠르도록 설계가 되어있다는 말을 어디서 들은 적이 있는데, 그것 때문이 아닐지 모르겠다.
 /* EOF는 End Of File의 약자이다. */

Ex)
{
1  char a = 'a';      // 문자형변수 a를 선언함과 동시에 a라는 문자로 초기화했다.
2  putchar(a);       // putchar()의 인자로 a라는 변수를 사용했다.
3  putchar('a');     // putchar()의 인자로 a라는 문자를 사용했다.
}

  두개의 putchar함수가 똑같은 결과를 출력한다. 줄을 바꾼다는 명령은 입력하지 않았기 때문에, aa와 같은 결과물을 얻을 수 있을 것이다.

  putch()  [ int putch(int c) ]  in conio.h
  putc()와 동일 한 함수이지만 콘솔 입출력용으로만 쓰이기 위해서 만들어진 함수로, conio.h (Console input Output) 파일에 정의되어 있다. ( 이 함수는 문자에 특성(색, 깜박임등)을 부여할 수 있는데, textattr()이라는 함수를 이용한다.)

  putche()
  수업시간에 들은것 같은데 인터넷을 뒤져도 튀어나오지가 않는다 -_- ;; 업데이트를 기다리라.........!

  puts()  [ int puts(const char*s) ]  in stdio.h
  Put String, 문장 출력함수다. 컴퓨터의 특성상 문장에 변화를 주기 어렵기 때문에 문자상수를 인자로 갖는다. 인자에는 문장을 집어 넣어도 되고, 문장의 첫 부분을 가리키는 포인터(나중에 배우자 이걸로 책한권 쓰는 사람도 있다.)나 배열이 사용되기도 한다.

Ex)
{
1  char *s = "puts 실습";
2  puts(s);
3  puts("성공 시에는 0을 리턴하고 실패했을때는 EOF(-1)를 리턴한다.");
}

  puts는 자동으로 문장의 끝에 \n문자(개행문자)를 삽입해준다. 자동으로 줄바꿈이 이루어진다는 뜻이다. 따라서 결과는 다음과 같다

puts 실습
성공 시에는 0을 리턴하고 실패했을때에는 EOF(-1)를 리턴한다.
_

/* _ 는 출력되지 않는 문장이지만 커서의 위치를 나타내기 위해 사용했다. */

  printf()   [ int printf(const char *format, ...)  ] in stdio.h
  Print Formatted, 형식이 있는 출력함수이다.
  갑자기 무슨 형식?!

  출력형식에는 여러가지가 있다. 10진수, 정수형, 문자, 문장, long형, float형 등등등
  출력형식은 [ % + 영소문자 ] 로 이루어진다.
  출력형식은 나중에 설명하도록 하고, 일단 예제먼저 본 후에 설명을 하도록한다.

Ex)
{
1  char ca = 'A', cb = 'B';        // 문자형 변수 ca와 cb를 선언한 후에 각각을 a와 b로 초기화했다.
2  char *s = "모두들 수고하셨습니다.";  // 포인터 변수 s에 문장을 입력했다.(그냥 그런다고만 알아두라)
3  int ia = 70, ib = 30                // 정수형 변수 ia와 ib를 선언한 후에 각각을 70과 30으로 초기화했다.
4
5  printf("%c는 %d점, %c는 %d점이고, 총점은 %d점입니다. ", ca, ia, cb, ib, ia+ib );
6  printf("%s", s);
}

  이 예제의 출력결과는 다음과 같다.

A는 70점, B는 30점이고, 총점은 100점입니다. 모두들 수고하셨습니다._

%c는 character의 약자로 문자를 출력하는 변환문자이고, %d는 decimal의 약자로 10진수를 출력하는 변환문자이다. %s는 string의 약자로 문장을 출력하는 변환문자이다.
 printf()의 첫번째 인자에는 여타 다른 함수와 마찬가지로, 상수밖에 들어갈 수가 없기 때문에, 외부에서 가져온 데이터( 각각의 이름과 점수 - 여기서는 직접 입력했지만, 입력을 받아서 사용할 수도 있다. ) 를 출력해야 할때 외부데이터가 들어갈 자리에 출력 형식만 지정을 하고, 그 자리에 들어갈 변수나 수식 혹은 상수를 두번째 인자부터 순서대로 기술해준다.
  조금 복잡하게 보일지 모르겠지만 별로 어렵지 않다. 다른 데서 가져온 데이터의 자리는 변환문자로 비워두고, 뒤에다가 다시 기술해준다는 것이 전부이다.

자 그럼 이제 printf함수를 더 능률적으로 사용할 수 있도록 출력형식에 대해서 알아보자. 출력형식은 변환문자에 의해서 바뀐다.
 
     %o / %O    8진수로 출력
     %d            10진수로 출력
     %x / %X    16진수로 출력
     %u            unsigned형식으로 출력
     %i             int형식으로 출력
     %f             float형식으로 출력
     %lf            double형식으로 출력
     %e / %E   지수형식으로 출력
     %s           문장으로 출력
     %c           문자로 출력
     %p           지정된 변수의 주소를 출력한다.

  이 변화문자에는 몇가지재미있는 장난을 칠 수가 있는데, %와 소문자 사이에 무엇을 집어넣는가에 의해서 출력형식이 더 자세해진다.

     %(자연수)(영문자)     숫자만큼의 칸을 차지하여 출력한다.
     %-(영문자)               왼쪽 정렬한다. ( 오른쪽 정렬이 기본형식이다. )
     %+(영문자)               숫자 출력시에 쓰이며, 부호를 출력한다.
     %.(자연수)(영문자)    실수 출력시에 쓰이며, 소수점 이하 (자연수)자리만큼 출력한다.
     %0(영문자)               출력하고 남은 왼쪽칸을 0으로 채운다.

  위의 기능들은 %+010.3f와 같이 섞어서 사용이 가능하다. [ float(실수)형식으로 10칸에 출력하되 부호를 사용하고 소수점 이하 세자리까지 출력하며, 출력된 숫자의 왼쪽 빈칸은 0으로 채운다 ]라는 의미이다.

  이걸 가지고 재미있게 놀면서 출력형식에 대해서 더 이해해 보길 바란다. 한가지 장난감을 주자면  모든 문자는 아스키 코드로 사용되기 때문에 정수형 변수 a에 97을 대입하고, %d로 출력하면 97이 그대로 나오지만, 문자형식인 %c로 출력하면 a라는 문자가 나온다.

  제어문자 (escape문자)
  마지막으로 제어문자에 대해서 알아보자. 변환문자는 \ + (문자) 로 구성되어 있다.

     \n    줄을 바꾼다( 개행문자 )
     \r     줄의 처음으로 간다.
     \b    커서를 왼쪽으로 한칸 옮긴다.
     \a    비프음을 출력한다.
     \t     탭을 출력한다.

     \%
     \'
     \"
     \\     모두 왼쪽에 나온 문자를 출력한다.
               이런 형식이 존재하는 이유는 뒤의 문자들이 모두 혼자 사용되면 다른 뜻으로 사용되기 때문이다.
               예를들어 " 문자는 문장을 끝내버릴테고, %가 나오면 변환문자로 인식할 것이다.

     \0    아무것도 아니다라는 뜻 이거나 문장의 끝을 나타낸다. 나중에 무슨 뜻인지 알게될 것이다.

  지금 나온 내용들은 그냥 읽기만 해서는 전혀 이해가 되지 않는 것들도 있을 것이다. 그림을 첨부해서 조금더 자세히 설명을 해야하지만 본인의 귀차니즘 덕분에 거기까지는 진행이 불가했다. 그림이 있다고 하더라도 이 내용이 머리에 조금더 오래 남기를 바란다면 직접 코딩을 해보는 것이 좋을 것이다.


오늘은 출력에 대해서 공부를 했다. 출력을 했으면 어딘가에는 입력하는 함수도 있을 것이다. 입력하는 함수는 내일. 혹은 다음주 월요일에 알아보도록 하자.

안녕 ㅋㅋ
반응형

'STUDY ! > 배워보자 C언어' 카테고리의 다른 글

#7. 반복문 - while문  (0) 2009.08.25
#6. 화면 입력함수  (0) 2009.08.24
#4. 문장의 구성요소  (0) 2009.08.20
#3. C언어의 구성요소(1)  (0) 2009.08.19
#2. C언어의 기초, 기본구조  (0) 2009.08.18