ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 0x03 입력과 출력 - 출력
    Legacy/C 2014. 12. 14. 04:27
    728x90

    오늘은 키보드를 통한 입력과 모니터를 통한 출력에 대해 배워보겠습니다. 

     

    데이터의 입력과 출력은 C 언어에서 제공한느 표준 라이브러리 함수의 일부인 입출력 함수를 이용해 코딩할 수 있습니다. 입력할 때는

    scanf 함수를, 출력할 때는 printf 함수를 많이 사용합니다. 여기서 라이브러리 함수란, 프로그램을 만들기위해 미리 정의되어있는 함수를 의미합니다. 만약 라이브러리 함수에 미리 정의되어있지 않다면 그 함수를 매번 작성해주어야 할 것입니다. 오늘 배울 입력과 출력에 사용되는 함수를 포함하고 있는 라이브러리 함수는 stdio.h 헤더파일에 포함되어 있습니다. 코딩시 입력했던 #include <stdio.h>가 바로 입출력을 위한 표준 라이브러리 함수를 불러오는 명령입니다. 여기서 stdio란 standard input/output의 약자로 표준 입출력함수를 정의해놓은 헤더파일입니다. 이러한 헤더파일에는 <stdio.h>, <stdlib.h>, <math.h> 등등 여러가지가 있습니다.

     

    출력 함수로 가장 많이 사용되는 printf 함수에대해 알아보겠습니다. 이전시간에 변환명세를 설명하면서도 한번 설명해 드렸습니다. 다시 한번 설명해 드리자면,

     

    printf("형식문자열", 인수1, 인수2, ..., 인수n)

     

    의 형태를 가지며 인수의 숫자는 형식문자열 내에 포함된 %문자. 즉, 변환명세의 갯수와 같습니다. 또한 대응되는 순서 또한 같습니다.

    물론 변환명세를 사용하지않고 printf("문자열")의 형태로 써도 상관 없습니다.

     

    그런데 만약 출력 결과를 보기좋게 하기위해 개행을 시키고 싶을 경우엔 어떻게 할까요?

     

    printf("abcd");

    printf("1234");

     

    라고 입력하면 화면에

     

    abcd1234

     

    라고 한줄로 입력되는게 보이실 겁니다. 이걸

     

    abcd

    1234

     

    라고 출력시키고 싶다면 개행문자를 이용해주어야 합니다. 개행은 이스케이프 문자를 이용해서 출력할 수 있는데요, 이스케이프 문자에는 여러가지 종류가 있습니다.

    여기서 /(슬래시)의 반대모양인 역슬래쉬가 나와야하지만 키보드에선 백슬래시는 없고 \가 백슬래시와 같은 의미를 합니다.

     표기

    이름

    의미 

     \r

     캐리지 리턴

     커서를 현재 행의 맨 앞으로 이동시킨다.

     \n

     개행 문자

     편집기에서 키보드의 엔터키를 눌렀을 때처럼 커서를 현재 행의 맨 앞으로 이동시킨 후 다음 행으로 옮긴다.

     \t

     탭 문자

     키보드의 탭키를 누를 때처럼 커서를 다음 탭 위치로 옮긴다.

     \'

     작은 따옴표

     작은 따옴표를 의미한다.

     \"

     큰 따옴표

     큰 따옴표를 의미한다.

     \\

     백슬래시

     이스케이프 문자의 시작인 \가 아닌 백슬래시 문자를 의미한다

     \b

     백스페이스

     키보드의 백스페이스키와 달리 단순히 출력 위치를 왼쪽으로 한칸 이동한다.

     \a

     알람

     삐 신호음을 낸다.



    그러므로

     

    printf("abcd\n");

    printf("1234");

     

    로 입력해야 원하는 출력결과를 얻을 수 있습니다.

    위의 표에서 백슬래시와 작은 따옴표, 큰 따옴표는 문자열에 나타내려는 것과 함수내에서 사용되는 이스케이프문자, 형식문자열의 끝을 나타내는 것과 구분해 주기위해 \", \', \\의 형태로 써야됩니다.

     

    이번에는 변환명세를 포함하는 printf 함수에대해 알아보겠습니다.

    변환명세에는 4가지 정도가 자주 쓰입니다.

     

    정수형 : %d

    실수형 : %lf

    문자 : %c

    문자열 : %s

     

    위 4개 외에도 8진수와 16진수 정수를 나타내는 변환 명세와 float형을 나타내는 변환 명세도 있습니다. 자세한건 추후 올리겠습니다.

    여기서 주의해야 할건 자료형과 변환명세의 종류가 같아야 한다는 것입니다. 만약 다를 경우 올바르지 않은 결과를 얻을 수도 있습니다.

    다음 소스를 실행해보면 무슨 말인지 금방 아실 겁니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <stdio.h>
     
    int main (void)
    {
        int a = 3;
        
        printf("%lf", a);
        
        return 0;
     
    }

    올바른 결과를 얻으려면 %lf를 %d로 바꿔주어야합니다. 

     

    변환명세는 필드폭, 정렬, 부호, 정밀도(실수형)를 사용할 수 있습니다.

    우선 필드폭이란 출력의 형태를 보기 좋도록 만들기 위해 미리 몇글자가 들어갈 자리인지 필드의 폭을 지정해 주는 것을 말합니다. 필드폭을 지정하는 방법은 3칸을 지정하려면 %3d, %10lf 처럼 지정해 주면 되며 부호를 표시해 주려면 %+필드폭d을 해주면 됩니다. +가 붙어있다고 무조건 +부호로 바꿔준다는 의미가 아니라 그냥 부호를 표시해 준다고 보시면 됩니다. 물론 음수는 부호를 표시해주지 않아도 무조건 부호가 표시됩니다. 그러므로 양수인 경우에만 해당하는 것으로 보시면 되겠습니다.

    또 필드폭을 지정하면 출력은 기본적으로 오른쪽 정렬로 되어있습니다. 이것을 왼쪽정렬로 바꾸어주려면 %-필드폭d을 해주시면 왼쪽정렬이 됩니다.

    마지막으로 실수형 변환명세에만 적용되는 정밀도에 대해 알아보겠습니다. 정밀도란 소숫점 몇자리 까지 출력해 줄건지 나타냅니다. 이것 역시 필드폭과 동시에 사용할 수 있는데 "%필드폭.정확도lf" 로 써주시면 됩니다. 기본적으로 %lf는 소수 6자리까지 출력을 해줍니다. 그러므로 "%.6lf" 라고 입력하신 것은 "%lf"와 같은 의미 입니다.

     

    문자와 문자열 역시 필드폭과 정렬 기능을 사용할 수 있습니다. 방법은 정수형과 같습니다.

     

    문자 출력함수로는 putchar도 존재합니다. 사용법은

     

    putchar('문자' 또는 문자형 변수);

     

    의 형태로 변환명세가 오지 않습니다. 그냥 printf 의 사용법만 완전히 숙지해주셔도 무방합니다.

     

    문자열 출력 함수로는 puts가 있습니다.

     

    puts("문자열" 또는 문자열을 저장한 변수);

    여기서 문자열을 저장할 수 있는 변수란 존재하지 않지만 나중에 배열에 대해 배우시면 무슨 말인지 아실겁니다. 여기선 그냥 문자열을 출력할 수 있다는 것만 알아주세요.

     

    이것으로 출력 마치겠습니다. 출력은 printf의 사용법, 이스케이프 문자, 변환명세의 정확한 사용, 필드폭 정도만 제대로 이해해주시면 문제없을 겁니다.

    'Legacy > C' 카테고리의 다른 글

    0x02 변수와 자료형  (0) 2014.12.14
    [참고] 아스키코드표  (0) 2014.12.14
    0x01 상수  (0) 2014.12.14
    0x00 C강의시작&C언어란?  (0) 2014.12.14
Designed by Tistory.