[ C 언어 스터디 ]

 

자료출처 : 핵심 길잡이 C 프로그래밍 언어

도서출판 : 성안당

 

4. 표준 입출력 함수

C 언어는 다른 언어들과는 달리 언어의 설계상 입출력 명령문이 없으며, 대신 입출
력을 담당하는 라이브러리 함수 ( library function ) 를 이용하여 입출력 기능을 제공하고
있다. 이것은 입출력 부분을 분리함으로써 C 언어의 본래 목적인 호환성 및 이식성을
향상시키기 위해서이다.
표준 입 . 출력을 수행하기 위해 필요한 입출력 함수들이 표준 C 라이브러리에 정의
되어 있다. 필요한 표준 입출력 함수를 사용하기 위해서는 반드시 # include  < stdio.h >
와 같이 표준 입출력 함수를 포함시킨 후 사용하여야 한다.
그러나 시스템에 따라 이것이 자동적으로 이루어지는 경우도 있다. 여기서 , 표준 입
력 ( standard input ) 이란 키보드 ( keyboard ) 로 프로그램 몇 데이터를 입력하는 것을 의
미하며 , 표준 출력 ( standard output ) 이란 컴퓨터 내부에서 실행된 프로그램의 결과를
단말장치화면 ( CRT ) 에 나타내는 것을 의미한다.
이 장에서는 C 언어에서 데이터를 입 . 출력하고자 할 때 사용하는 기본적인 표준 입
출력 함수들의 기능과 사용 방법에 대해서 살펴보기로 한다.

 

★ 표준 입출력 함수 ★

< 표준 출력 함수 : printf ( ) >

printf ( ) 는 프로그램이 실행된 후 출력 결과를 적절한 형식을 지정하여 화면에 나
타내 줄 때 사용하는 함수이다. 여기서 printf 는 " print  formatted " 혹은 " formatted
print - out " , " print  under  format " 의 약칭이다.
printf ( ) 함수의 일반 형식은 다음과 같다.

형식

 printf ( " 형식 지정 제어문자열 , 매개변수들 " ) ;

형식 지정 제어문자열 ( format - string ) 은 실제로 출력될 문자열과 출력 형태를 나타
내는 변환 문자로 이루어져 있다. 출력하고자 하는 결과를 printf ( ) 함수의 이중 인용
부호 ( "  " ) 내에 적절한 형식으로 나타내기 위해서 각 매개변수에 1 : 1 로 대응되는 출력
형식 지정 변환 문자를 사용해야 한다. 매개변수들은 출력할 데이터 즉 상수 , 변수 , 식
등으로 이들은 각각 콤마 ( comma : , ) 로 구분된다. 경우에 따라 매개변수들은 생략될
수도 있다.

[ 표 4 - 1 ] 은 printf ( ) 함수에 이용되는 출력 형식 지정을 위한 변환 문자들의 종류와
기능을 나타낸다.

[ 표 4 - 1 ] 변환 문자

변환 문자 의 미
%d 부호 있는 10진 정수로 출력한다.
%u 부호 없는 10진 정수로 변환하여 출력한다.
%o 부호 없는 8진 정수로 변환하여 출력한다.

%x
%X

부호 없는 16진 정수로 변환하여 출력 ( 소문자 a ~ f 를 사용 ) 한다.
부호 없은 16진 정수로 변화하여 출력 ( 대문자 A ~ F 를 사용 ) 한다.

%e   %E 지수 형태의 실수 ( m.nnnnnExx ) 로 출력한다.
%f 10진 형태의 실수 ( m.nnnnn )로 출력한다.
%g   %G %e 또는 %f 중 출력되는 길이가 짧은 쪽을 선택해서 출력한다. 이때 유 효하지 않은 0 출력되지 않는다.
%c 한 개의 문자를 출력한다.
%s 문자열 즉 널문자 ( null character : \0 ) 가 나타날 때까지 출력한다.
%lo long 형 8 진수로 출력한다.
%lx long 횽 16 진수로 출력한다.
%% % 문자를 출력한다.

또한 변환 문자만으로는 원하는 형태로 출력하기가 어렵다. 예를 들어, 실수의 경우
소수점 이하 몇째 자리까지 출력할 것인가를 조정할 수 있어야 한다. 그러나 변환 문자
만으로는 시스템이 정해 준 형태로만 출력된다. 이와 같이 % 와 변환 기호 사이에 출력
조정자 ( modifier ) 를 사용하여 출력 형태를 조정할 수 있다. 이들의 종류와 기능은

[ 표 4 - 2 ] 와 같다.

형식
% - w . nl [ 변환문자 ]

 

조정자 기 능
- ( minus sign )

출력 필드 폭 ( field width )의 왼쪽에 맞추어 출력하고, 오른쪽은 공백 ( blank ) 으로 채운다.

w ( field width )

출력 필드 폭을 나타낸다. 만일, 필드 폭이 출력 값의 자리수보다 적으면 출력 값의 자리수만큼 증가된다. 단, 필드 폭을 나타내는 숫자 앞에0 ( zero ) 가 있으면 공백 대신 0 로 채운다.

n ( precision )

실수형 데이터에 대하여 소수점 이하 몇째 자리까지 출력할 것인가를나타내며, 바로 밑의 자리수에서 반올림이 이루어진다.문자열의 경우에는 최대 몇 개의 문자를 출력할 것인가를 나타낸다.

1

출력 대상을 long int 로 간주하여 출력한다. 단, d, o, u, x, 변환 문자에만 적용할 수 있다.

 

다음 프로그램의 출력 결과를 나타내시오 ( 10진 정수형 데이터 출력 )

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

printf ( " %d \n " , 1234 ) ;
printf ( " %2d \n " , 1234 ) ;
printf ( " %6d \n " , 1234 ) ;
printf ( " %06d \n " , 1234 ) ;
printf ( " %-6d \n " , 1234 ) ;

}

▶ 실행 결과
1234
1234
  1234
001234
1234

 

다음 프로그램의 출력 결과를 나타내시오 ( 8 , 10 , 16 진수 및 부호 없는 10진 정수 출력 )

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

int i , j ;
i = 300 ;
j = -200 ;
printf ( " %o \n " , i ) ; // 8진수로 출력
printf ( " %x \n " , i ) ;  // 16진수로 출력
printf ( " %d \n " , i ) ;  // 10진수로 출력
printf ( " %u \n " , i ) ;  // 부호 없는 10진 정수 출력
printf ( " %d \n " , 32770 ) ;  ------------ 1
printf ( " %u \n " , 32770 ) ;
printf ( " %d \n " , j ) ;   // 10진수로 출력
printf ( " %d \n " , j ) ;  -------------- 2  //부호 없는 10진 정수 출력

}

▶ 실행 결과 ( Turbo C 에서 실행할 것 )
454
12c
300
300
-32766
32770
-200
65336

이 때 Visual Studio 에서 실행하면 1의 결과는 32770 이고 2의 결과는 4294967096
으로 출력된다.

다음 프로그램의 출력 결과를 나타내시오 ( 실수형 데이터 출력 )

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

printf ( " %f \n " , 3.141592 ) ;
printf ( " %e \n " , 3.141592 ) ;
printf ( " %g \n " , 3.141592 ) ;
printf ( " %8.2f \n " , 3.141592 ) ;
printf ( " %13.4e \n " , 3.141592 ) ;
printf ( " %13.5e \n " , 3.141592 ) ;

}

▶ 실행 결과

3.141592
3.141592e + 000
3.14159
3.14  
3,1416  

 

다음 프로그램이 출력 결과를 나타내시오 ( 문자열 데이터 출력 )

▶ 프로그램

# include  < stdio.h >

# define  STR    " Turbo C Programming "

void main ( void )
{

printf ( " %s \n " , STR ) ;
printf ( " %5s \n " , STR ) ;
printf ( " %25s \n " , STR ) ;
printf ( " %25.7s \n " , STR ) ;
printf ( " %-25.7s \n " , STR ) ;

}

▶ 실행 결과

Turbo C Programming
Turbo C Programming
Turbo C Programming  
Turbo C  
Turbo C

 

< 표준 입력 함수 : scanf ( ) >

scanf ( ) 함수는 키보드를 통해 데이터를 입력받는 함수로 숫자, 문자, 문자열 등을
지정된 서식에 따라 입력받아 매개변수에 저장한다. 또한 scanf ( ) 가 데이터를 읽어들
일 때 탭 ( tab ) 과 공백 ( blank ) , 개행 ( newline ) 문자 등에 의해 데이터가 구분된다.
scanf 는  " scan formatted " 혹은 " scan under format " 의 약자이며 일반 형식은 다
음과 같다.

형식
scanf ( " 형식 지정 제어문자열 " , 매개변수들 ) ;

형식 지정 제어문자열 ( format - string ) 은 입력 장치인 키보드로부터의 입력 형식을
의미하는 변환 문자를 말한다. 매개변수들로는 읽어들인 데이터가 저장될 메모리를 지
정하는 변수, 즉 변수의 포인터를 사용해야 한다. 여기서 포인터 ( pointer ) 란 변수가 기
억된 위치 , 즉 주소 ( address )를 의미한다. 따라서, 어떤 변수에 데이터 값을 읽어들이
라면 변수명 앞에 간접연산자 ( & ) 를 붙이면 된다. 그러나, 문자열 변수에 데이터 값을
읽어들일 때에는 간접연산자를 사용하지 않고 문자열 변수명만 적은면 된다.

[ 표 4 - 3 ] 변환 문자

변환 문자 의 미
%d 부호 있는 0진 정수를 읽어들인다.
%h short형 정수를 읽어들인다.
%o 부호 없는 8진 정수로 읽어들인다.
%x 부호 없는 16진 정수로 읽어들인다.
%X 부호 없는 16진 정수로 읽어들인다.
%u 부호 없는 정수로 읽어들인다.
%f , %e 부동 소수점 형태로 읽어들인다.
%c 하나의 문자로 읽어들인다.
%s 문자열로 읽어들인다.
* * 다음에 지정된 변환 기호에 해당하는 입력 데어터를 읽지 않고 건너뛴다.

 

키보드로부터 하나의 문자를 입력받아 화면으로 출력하는 프로그램을 작성하시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char a ;
scanf ( " %c " , &a ) ;
printf ( " %c \n " , a ) ;

}

▶ 실행 결과
TC
T

 

★ 기타 입출력 함수 ★

< getchar ( ) , putchar( ) >

단일 문자를 입출력하는 버퍼형 입출력 함수이다. getchar ( ) 함수와 putchar ( ) 함수
는 stdio.h 라는 파일에 정의되어 있으므로 이 함수들을 사용할 경우에는 반드시
# include  < stdio.h >를 프로그램의 선두에 선언해야 한다.

1. getchar ( )

getchar ( ) 함수는 키보드로부터 한 번에 한 문자씩 읽어들여, 그 문자에 해당하는
ASCII 코드의 값을 정수형으로 선언된 변수에 할당하는 함수이다. 단, 파일의 끝을 만
나면 -1 의 값을 되돌린다.
getchar ( ) 함수의 일반 형식은 다음과 같다.

형 식
getchar ( ) ;

 

int  i ;

i = getchar ( ) ;

예를 들어 키보드로 문자 ' A '를 입력하면 정수형 변수 i 에 65가 기억된다.

2. putchar ( )

putchar ( ) 함수는 화면에 한 문자씩 출력하는 함수이다. putchar ( ) 함수의 일반
형식은 다음과 같다.

형 식
putchar ( 인 수 ) ;

putchar ( ) 함수는 인수의 ASCII 코드 값에 해당하는 문자를 출력한다. 단, 인수는
문자형 상수이거나 문자형 변수이다. 인수를 정수나 정수형 변수로 쓸 수도 있는데, 이
때 정수값에 해당하는 ASCII 문자가 출력된다.

putchar ( ' A ' ) ;
putchar ( 65 ) ;
putchar ( ch ) ;
putchar ( ' \n ' ) ;

 

키보드로부터 하나의 문자를 입력받아 화면에 출력하는 프로그램이다. 실행 결과를 나타내 시오

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char  c ;
c = getchar ( ) ;
putchar ( ) ;

}

▶ 실행 결과
a   Enter Button Push
a

 

키보드로부터 대문자를 입력받아 소문자로 출력하는 프로그램이다. 실행 결과를 나타내시오

▶ 프로그램

# include  < stdio.h >
# include  < ctype.h >

void main ( void )
{

char  c ;

while ( ( c = getchar ( ) ) != EOF )
{

c = tolower ( c ) ;
putchar ( c ) ;

}

}

▶ 실행 결과
HELLO !    Enter  Button Push
hello !      Ctrl + z   Push

 

< gets ( ), puts ( ) >

1. gets ( )

gets ( ) 함수는 키보드로부터 문자열을 읽어들여 문자열 포인터가 가리키는 장소에
기억시키며, 그 포인터를 되돌려 주는 함수이다. gets ( ) 함수의 일반 형식은 다음과
같다.

형 식
gets ( 인 수 ) ;

gets ( ) 함수는 개행문자 ( ' \n ' ) 앞에 있는 모든 문자 ( 공백, 탭 ( tab ) 포함 )를 읽어들이
며, 개행문자는 널문자 ( null character, ' \0 ' )로 바꾸어 기억된다. 이것은 개행문자 앞에
있는 문자들을 문자열로 만들어 주는 것을 의미한다.

다음 프로그램은 gets ( ) 함수를 이용하여 문자열을 입력하는 예이다.

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char str [ 20 ] ;
gets ( str ) ;
printf ( " %s \n " , str ) ;

}

▶ 실행 결과
Hong Gil Dong   Enter Button Push
Hong Gil Dong

한편, 문자열은 scanf ( ) 함수의 %s 변환기호를 이용하여 읽어들일 수도 있다. 그러
나 %s 변환기호는 공백, 탭, 개행문자를 만나면 문자열의 끝으로 간주하기 때문에 문
자열을 입력할 때에는 gets ( ) 함수를 많이 사용한다.

다음 프로그램은 scanf ( ) 함수를 이용하여 문자열을 입력하는 예이다.

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char str [ 20 ] ;
scanf ( " %s " , str ) ;
printf ( " %s \n " , str ) ;

}

▶ 실행 결과
Hong  Gil  Dong  Enter Button Push
Hong

 

2. puts ( )

puts ( ) 함수는 문자열을 화면으로 출력하는 함수이다. ' \0 ' 을 만나면 ' \n ' 으로 바꾸
어 출력한다. 또한 문자열은 printf ( ) 함수의 %s 변환기호를 이용하여 출력할 수도
있다. puts ( ) 함수의 일반 형식은 다음과 같다.

형 식
puts ( 인 수 ) ;

puts ( ) 함수와 printf ( ) 함수의 차이점은, puts ( ) 함수는 각 문자열마다 자동으로
개행문자 ( ' \n ' )를 출력하지만, printf ( ) 함수는 원하는 곳에만 개행 문자를 출력할 수
있다는 것이다.

다음 프로그램은 puts ( ) 함수를 이용하여 문자열을 출력하는 예이다.

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char *str1 = " The Sample C " ;
char *str2 = " Programming " ;
puts ( str1 ) ;
puts ( str2 ) ;

}

▶ 실행 결과
The Sample C  // 자동으로 줄바꿈이 이루어진다.
Programming

 

다음 프로그램은 printf ( ) 함수를 이용하여 문자를 출력하는 예이다.

▶ 프로그램

# include  < stdio.h >

void main ( void )
{

char *str1 = " The Sample C " ;
char *str2 = " Programming " ;
printf ( " %s " , str1 ) ;
printf ( " %s \n " , str2 ) ;   // 지정된 위치에서만 줄바꿈이 된다.

}

▶ 실행 결과
The Sample C Programming