ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • printf 함수의 기본
    c언어 기초 2017. 3. 16. 14:49


    1. printf 는 출력을 위한 함수 

    - 특수 문자 출력이 가능하다. 


    \a alert 경고음(비프음) 소리

    \b 백스페이스 backspace

    \f  폼 피드 form feed

    \n 개행 new line

    \r 캐리지 리턴 carriage return 줄의 맨 처음으로 이동 

    \t 수평탭 tab 만큼 이동

    \v 수직탭

    \\ 백슬래시 \

    \' 작은 따옴표

    \" 큰따옴표 




    - 특수 문자 출력 예

    앞집 강아지가 말했다. "멍! 멍! 귀엽다."  


    - printf 함수는 서식 지정이 가능하다

    * f는 formatted 를 의미

    * 서식지정 : 출력의 형태를 지정한다는 것을 의미. 문자열 안의 숫자 삽입


    #include <stdio.h>

     

     int main(void)

     {

         int age=12;

         printf("10진수로 %d살이고 16진수로 %x살 입니다.", age, age);

         return 0;

     }


    %c  단일 문자, 문자가 아닌 숫자가 들어오는 경우 아스키코드값이라고 인식하여 아스키코드값인 숫자를 문자로 바꿔 출력함

    %d  부호있는 10진 정수

    %s  문자열

    %f  부호 있는 1진 실수


    - 필드 폭을 지정하여 출력 가능


    %8d  필드 폭을 8칸 확보하고 오른쪽 정렬해서 출력하라.

    %-8d  필드 폭을 8칸 확보하고 왼쪽 정렬해서 출력하라.

    %+8d   필드 폭을 8칸 확보하고 오른쪽 정렬한 상태에서 양수는+, 음수는 –를 붙여서 출력하라.




    2. 예

    /* printf01.c */


    #include <stdio.h>


    int main(void)

    {

        printf("Hello Everybody \n");

        printf("%d \n", 1234);

        printf("%d %d \n", 10, 20);

        return 0;

    }


    2. 서식문자 (Conversion specifier)란 출력 대상의 출력 형태를 지정하기 위한 문자













    ■10진 정수의 출력 방법 
    제어 문자 "%d"는 인수를 10진 정수로 출력한다. 사용 형식 “%[-m]d”에서 “[ ]” 부분은 생략가능한 부분으로 확장 기호 '-'는 인수의 값을 필드의 좌측을 기준으로 출력할 때 사용하며, 'm'은 출력할 값의 폭(width)을 지정할 때 사용한다.           
    그러면 다음 예제를 통하여 제어 문자 "%d"의 사용 방법을 알아보자. 실행 결과에 나타난 _는 공백을 의미하며 실제 화면에 문자로 표시되지는 않는다. 

     

    #include <stdio.h> 

     3 : 
     4 :  main() 
     5 :  { 
     6 :     int su1 = 1234; long su2 = 123456; 
     7 :     /* long은 long int와 의미가 같다. */  
     8 : 
     9 :     printf("su1 = %d\n", su1);                 ① 
    10 :     printf("su1 = %-6d\n", su1);             ② 
    11 :     printf("su1 = %7d\n", su1);                      ③ 
    12 : 
    13 :     printf("su1 = %3d\n", su1);                      ④ 
    14 :     printf("su2 = %ld\n", su2);                       ⑤  
    15 :     /* ld는 long 형 10진 정수형을 의미한다 */ 
    16 :  } 







    su1 = 1234

    su1 = 1234__
    su1 = ___1234

    su1 = 1234
    su2 = 123456


    ① "%d"와 같이 출력할 인수 값의 폭을 지정하지 않으면, 인수 su1이 출력될 만큼의 자리만을 확보하여 출력한다. 여기에서 su1의 값이 “1234”이므로 4자리가 확보될 것이다. 
    ② "%-6d"와 같이 확장 기호 '-'가 있으면, 인수 su1의 값을 지정된 6자리 필드의 좌측을 기준으로 출력한다. 
    ③ "%7d"와 같이 확장 기호 '-'가 없으면, 필드 폭을 7자리로 확보해 두고 인수 su1의 값을 필드의 우측을 기준으로 출력한다. 
    10행, 11행과 같이 제어 문자열에서 지정한 필드의 폭이 출력할 값의 자리수 보다 큰 경우에는, 전체 필드에서 남은 자리를 공백(' ')으로 채운다. 
    ④ 그러나, 13행에서와 같이 제어 문자열에서 지정한 필드의 폭이 출력할 값의 자리수 보다 작은 경우에는, 제어 문자열에서 지정한 필드의 폭을 무시하고 인수 su1의 값이 출력될 수 있는 만큼의 자리수를 확보하여 출력한다. su1의 값이 “1234”이므로 4자리가 확보될 것이다. 
    ⑤ 자료형이 long 형(long int 형)인 경우에는 제어 문자 "%ld"를 사용하여야 한다. 여기서 'l'은 “long”을 의미한다. 
    만약 인수 su2를 "%d"로 지정하여 출력하면 오버플로우(overflow, =범람)가 발생할 것이다. 


    ■부동소수점수의 출력 방법  

    제어 문자 "%f"는 인수를 부동소수점수(이제부터 “실수”로 언급한다)로 출력한다. 사용 형식 “%[-m.n]f”에서 “[ ]” 부분은 생략가능한 부분이다. 여기에서 'm'은 소수점을 포함한 전체 자리수를 나타내며, 'n'은 소수점 이하 자리수를 나타낸다. 

    다음의 예제를 통하여 제어 문자 "%f"의 사용 방법을 알아보기로 하자. 

     

    1 :  /* filename : ch4-3.c */ 

     2 :  #include <stdio.h> 

     3 : 

     4 :  main() 

     5 :  { 

     6 :     float su1  = 123.456; 

     7 :     float su2  = 12.3456789; 

                8 :     double su3 = 1.23456789; 

     9 : 

    10 :     printf("su1 = %f\n", su1);                 ① 

    11 :     printf("su2 = %f\n", su2); 

    12 :     printf("su1 = %6.2f\n", su1);             ②            

    13 :     printf("su3 = %11.8f\n", su3);            ③ 

    14 :     printf("su3 = %-11.8f\n", su3);           ④ 

    15 :  } 










    su1 = 123.456001

    su2 = 12.345679

    su1 = 123.46

    su3 = _1.23456789

    su3 = 1.23456789_ 



    ① 인수를 제어 문자 "%f"로 출력하면, printf() 함수는 기본적으로 소수점 이하 6자리까지 출력한다. 그리고 11행에서와 같이 인수의 소수부가 6자리를 넘는 경우에는, 소수점 이하 7째 자리에서 반올림하여 출력한다. 

       그런데, 실행 결과를 자세히 살펴보면 소수점 이하 6째 자리가 6행에서 정의한 su1의 값과는 다르다는 것을 발견할 수 있을 것이다. 이러한 결과는 컴파일러 종류에 따라 다르며, 차이가 나는 값 자체는 무시할 정도로 미세하다. 이 결과는 아날로그(analog)인 수치를 디지털(digital) 형식의 컴퓨터로 표현할 때 생기는 불가피한 에러라고 보아도 무방하다. 


    ② 제어 문자열 "%6.2f"에서는 인수의 값을 소수점 이하 2째 자리까지 출력하도록 지정하였으므로, 소수점 이하 3째 자리에서 반올림된 값이 출력된다. 


    ③ 제어 문자열 "%11.8f"처럼 확장 기호 '-'를 생략하면, 인수의 값이 지정된 필드의 우측을 기준으로 출력된다. 


    ④ 그러나, "%-11.8f"와 같이 확장 기호 '-'를 사용하면, 인수의 값이 지정된 필드의 좌측을 기준으로 출력된다. 




    ■ 문자와 문자열의 출력 방법 

    제어 문자 "%c"는 인수를 하나의 문자로 출력하고, "%s"는 인수를 문자열로 출력한다. 

    다음은 제어 문자 "%c"와 "%s"가 사용되는 예를 보여주는 프로그램이다. 

    2 :  #include <stdio.h> 

     3 : 

     4 :  main() 

     5 :  { 

     6 :     char ch ='A', str[20] = "character string";           ① 

     7 : 

     8 :     printf("문자   = %3c\n", ch);                     ② 

     9 :     printf("문자열 = %-20s\n", str);                   ③ 

    10 :  } 







    문자   = __A

    문자열 = character string____




    ① 단일 인용부호 내의 문자형 상수 'A'를 char 형 변수 "ch"에, 그리고 이중 인용부호 내에 포함되어 있는 문자열 상수 "character string"을 char 형 배열 "str"의 초기값으로 대입하였다. char 형 배열에 대한 자세한 내용은 10장을 참조하기 바란다. 


    ② 출력 인수 "ch"의 필드 폭을 3자리로 확보해 두고 필드의 우측을 기준으로 출력한다. 


    ③ 제어 문자열에 확장 기호 '-'가 포함된 경우에는, 지정한 필드 폭 만큼의 자리수를 정해놓고 필드의 좌측을 기준으로 출력한다. 

       그리고 8행, 9행에서와 같이 지정된 필드의 폭이 출력될 인수 값의 자리수보다 큰 경우에는 나머지 자리수를 공백으로 채운다. 



    ■ 10진 정수의 입력 방법 
    표준 입력 함수 scanf()를 통하여 10진 정수를 입력받기 위해서는, 제어 문자로 "%d"를 사용하여야 한다. 

     

    2 :  #include <stdio.h> 

     3 : 

     4 :  main() 

     5 :  { 

     6 :     int kor, mat, eng, number; 

     7 :     float average; 

     8 : 

     9 :     printf("학번을 입력하세요... "); 

    10 :     scanf("%d", &number);                                  ① 

    11 :     printf("3과목 성적을 입력하세요... "); 

    12 :     scanf("%d %d %d", &kor, &mat, &eng); 

    13 :     average = (float) (kor + mat + eng) / 3.0;                 ② 

    14 :     printf("학번 %d : 성적 평균 = %4.1f\n", number, average); 

    15 :  } 







    학번을 입력하세요... 

    1123ꏮ

    3과목 성적을 입력하세요... 

    94 87 91ꏮ

    학번 1123 : 성적 평균 = 90.7



    ① scanf() 함수를 통해 임의의 자료를 입력받는 경우, 입력 자료에 관련된 메시지를 9행과 같이 printf() 함수로 먼저 표시하면 정확한 자료의 입력에 도움이 될 것이다. 

    ② int 형 변수 "kor", "mat", "eng"의 평균값을 float 형으로 변환하기 위하여, cast 연산자 "(float)"를 사용하였다. 


    'c언어 기초 ' 카테고리의 다른 글

    연산자  (0) 2017.03.20
    C언어 Visual Studio scanf 에러 해결 방법  (2) 2017.03.19
    데이터 저장을 위한 변수  (0) 2017.03.17
    C언어의 개론적 이야기  (0) 2017.03.16
    visual c++ 설치 및 기본 셋팅  (0) 2017.03.16

    댓글

Designed by Tistory.