본문 바로가기

Programming

[C언어] C언어 기초강좌 4 / C언어 / 프로그래밍 기초 / 프로그램 만들기

이번 강좌에서는 입출력 함수인 printf, scanf를 배워 보겠습니다. 


1. 입출력 함수 



이제 입출력 함수 2가지를 배워 보죠.

화면에 입출력 하는 함수로 가장 많이 쓰이는 것이 

printf함수와 scanf함수 입니다. 

이것들에 대해 자세히 공부해 보도록 하죠. 
(1) 출력 함수 printf 

화면 출력 함수중 가장 많이 쓰이는 printf함수를 배워 보겠습니다. 

이 함수는 지금까지 예제 소스에 많이 나왔던 것 이지만 따로 배운적은 

없습니다. 

이제 그 printf함수에 대해 알아보죠. 

printf함수는 stdio.h라는 헤더 파일에 정의되어 있습니다. 

그리고 사용법을 간단히 본다면 다음과 같죠 


printf(포맷문자열[,인수,인수..]); 


여기서 포맷 문자열이란 출력하는 형태를 지정하는 문자열이고 

인수는 출력할 내용들 입니다. 


그럼 포맷문자열을 자세히 알아볼까요 

포맷문자열을 구성하는 것은 일반 문자와 변환지정이 있습니다. 

일반 문자에 대해서는 화면에 그냥 출력되게 됨니다. 

예를 들어 


printf("Example"); 


이렇게 하면 Example이 그냥 화면에 출력되죠 

그런데 printf에서 중요한건 변환지정 입니다. 

변환지정은 %로 시작합니다. 사실 변환지정은 정말 무지무지하게 

복잡하지만 지금은 간단한 것들만 배우도록 하죠. 

나머지는 나중에 더 자세히 배우기로 합시다. 

사실 자세하게 알 필요도 없지만.. 

변환지정은 간단히 


%[크기]타입 


이런 구조를 가진다고 보시면 됨니다. 

우선 타입부터 배우도록 하죠 

타입 지정은 여러가지가 있는데 다음을 보도록 하세요. 


문자 인수 형태 출력 

------------------------------------------------------------------ 

d 또는 i 정수 부호있는 10진 정수 

u 정수 부호없는 10진 정수 

o 정수 부호없는 8진 정수 

x 정수 부호없는 16진 정수(a,b,c,d,e,f사용) 

X 정수 부호없는 16진 정수(A,B,C,D,E,F사용) 

f 소수 부호있는 소수([-]???.??형태) 

e 소수 부호있는 소수([-]???.??..e[+/-]???형태) 

g 소수 주어진 값에 따라.. 

f또는 e를 자동으로 선택.. 

E 소수 부호있는 소수([-]???.??..E[+/-]???형태) 

G 소수 주어진 값에 따라.. 

f또는 E를 자동으로 선택.. 

c 문자 1문자 

s 문자열 문자열 

% None %를 출력 

p 포인터 포인터를 출력(????:????형태) 

------------------------------------------------------------------ 

(e와 E의 차이는 지수 표시에 e를 쓰느냐와 E를 쓰느냐의 차이) 


이것을 잘 읽어 보세요. 

그럼 한가지 예를 들어 보죠. 


printf("%d",10); 


이렇게 하면 10이 출력 됨니다. 

물론 


int a=10; 

printf("%d",a); 


이렇게 해도 10이 출력되죠. 

이런 식으로 다른 것들도 사용하면 됨니다. 

printf함수는 직접 해보는 것이 가장 쉽게 

배우는 방법입니다. 

그런데 만약 

long int형이라면 어떻게 출력할까요? 

이런걸 지정하는 것이.. 


%[크기]타입 


여기서 크기 입니다. 

크기를 지정하는 문자는 2가지만 알아두도록 하세요. 

h와 l두가지 말입니다. 

h를 써 주면 short int가 되고 l을 쓰면 long int가 됨니다. 

예를 들어 


short a=10; 

long b=20; 

printf("%hd",a); 

printf("%ld",b); 


이럴때 사용합니다. 

그리고 인수는 여러개일수도 있는데 변환지정이 여러개이면 

인수도 여러개이어야 합니다. 

예를 들어 


printf("%d %c %f",10,'A',1.1); 


이런 식으로.. 

이제 예제 하나만 보죠 


/* 파일 이름 : C4-7.C 

프로그램 내용 : printf를 설명하는 프로그램. */ 

#include 

void main() 

{ 

int a=10; 

long int b=12345678; 

float c=0.2934; 

double d=0.193303944665433356; 

char e='C'; 

char f[]="String"; 


printf("%d\n%ld\n",a,b); 

printf("%f\n%e\n",c,d); 

printf("%c\n%s\n",e,f); 

} 


이 프로그램은 printf를 사용하여 여러가지 형태로 출력하는 프로그램인데 

잘 보시면 금방 이해 되실 겁니다. 

특별히 설명을 필요 없겠죠? 

그럼 결과를 볼까요? 


C:\>C4-7.EXE 

10 

12345678 

0.293400 

1.933039e-01 

C 

String 


C:\> 


(2) 입력 함수 scanf 

scanf는 printf와 사용법이 매우 비슷 하지만, 

출력용이 아니라 입력용 함수 입니다. 

scanf함수 역시 printf함수와 마찬가지로 stdio.h라는 헤더 파일에 

정의되어 있습니다. 

사용법은 


scanf(포멧문자열[,주소,주소..]); 


이런식으로 알아두시면 편합니다. printf와 똑같죠? 

여기서 포멧 문자열은 입력받을 형태를 지정하는 문자열 입니다. 

그리고 주소는 입력받은 데이터를 저장할 변수의 주소이죠. 

그런데 변수의 주소는 어떻게 알수 있을까요?? 

이건 사실 포인터를 베울때 베우는 건데 

그냥 주소를 알아내는 방법만 가르쳐 드리죠. 

어떤 변수의 주소를 알아낼때는 &연산자를 씁니다. 

예를 들어 a라는 변수가 있다면, a의 주소는 &a가 됨니다. 

그런데 문자열을 입력 받기 위해 문자 배열을 만들었을경우 

예를 들어 


char str[10]; 


이런 변수가 있을때는 str그 자체가 

주소가 됨니다. 이유는 배열명은 배열의 시작 주소를 가지고 있기 때문이죠. 

그러므로 이때만은 &str로 사용해서는 안됨니다. 


그럼 포멧 문자열에 대해 자세히 알아보죠. 

포멧 문자열을 구성하는 문자는 printf와 비슷한데.. 

일반 문자와, 입력 지정 문자가 있습니다. 

일반 문자는 그냥 입력 형태를 지정할때 쓰이는데 그냥 베우다 보면 아시게 됨니다. 

그리고 입력 지정 문자는 printf에서와 완전히 똑같습니다. 

모두 %로 시작하고 

%[크기]타입 

이런 구조로 되어 있죠 printf를 베울때 가르쳐 드렸지만. 

그래도 다시 한번 타입 지정하는 문자들을 

보여 드리죠. 


문자 인수 형태 출력 

------------------------------------------------------------------ 

d 또는 i 정수 부호있는 10진 정수 

u 정수 부호없는 10진 정수 

o 정수 부호없는 8진 정수 

x 정수 부호없는 16진 정수(a,b,c,d,e,f사용) 

X 정수 부호없는 16진 정수(A,B,C,D,E,F사용) 

f 소수 부호있는 소수([-]???.??형태) 

e 소수 부호있는 소수([-]???.??..e[+/-]???형태) 

g 소수 주어진 값에 따라.. 

f또는 e를 자동으로 선택.. 

E 소수 부호있는 소수([-]???.??..E[+/-]???형태) 

G 소수 주어진 값에 따라.. 

f또는 E를 자동으로 선택.. 

c 문자 1문자 

s 문자열 문자열 

% None %를 입력 

p 포인터 포인터를 입력(????:????형태) 

------------------------------------------------------------------ 


이것들을 한번 보시고....... 한가지 예를 들어 보죠. 

만약 정수를 입력받고 싶다면 어떻게 할까요? 

바로 


int a; 

scanf("%d",&a); 


이런 식으로 하면 되겠죠? 

그럼 다음으로 넘어가서 입력 지정 문자의 


%[크기]타입 


이 형식에서 크기는 printf에서와 똑같은 의미 입니다. 

크기 지정 문자는 h와 l이 있는데, 

h를 쓰면 short int를 입력 받을때 쓰는 것이고, 

l을 쓰면 long int를 입력 받을때 쓰는 것 입니다. 

예를 들어 보면 


short a; 

long b; 

scanf("%hd",&a); 

scanf("%ld",&b); 


이렇게 사용하는 것 이죠 scanf함수도 printf함수처럼 

많이 사용해보는 것이 가장 쉽게 배우는 길 입니다. 

그러므로 많이 연습해보시길 바랍니다. 

scanf함수를 쓰면 여러가지 형태의 데이터를 

쉽게 입력받을수 있습니다. 

만약 


1, 2, 3 


이런 형식의 데이터를 입력받고 싶다면 

포멧 문자열을 


"%d,%d,%d" 


이렇게 만들어 주면 됨니다. 


int a,b,c; 

scanf("%d,%d,%d",&a,&b,&c); 


이런 식으로 하면 되겠죠? 

이정도면 scanf함수도 이해 하셨으리라 봅니다. 

그리고 마지마으로 한가지 알아두실 점이 있는데 

scanf로 문자열을 입력 받을때 

즉 


char str[100]; 

scanf("%s",str); 


이런 식으로 할 때 

입력 받을 문자열에는 공백이 없어야 합니다. 

scanf라는 함수로 문자열 입력을 받을때는 

공백을 허용하지 않는다는 것 이죠. 

만약 공백이 있을 경우 심각한 현상이 발생하는데, 

직접 경험해 보시기 바랍니다..! 




이번 강의에서는 계속해서 입출력 함수인 

getchar, putchar, getch, putch, getche등을 배워 보겠습니다. 


2. 문자 입출력 

C언어에는 printf, scanf말고도 문자 입출력 함수가 있습니다. 

그것들에 대해 배워 보죠. 


(1) getchar과 putchar 

문자 입출력 함수인 getchar과 putchar함수를 배워보겠습니다. 

이 함수들은 각각 한 문자를 입력, 출력하는 함수 입니다. 

둘다 stdio.h에 정의되어 있죠. 

getchar함수의 사용법은 


[변수=]getchar(); 


이런 식으로 쓰면 됨니다. 

여기서 변수는 입력 받은 문자가 들어갈 변수 입니다. 

다음 putchar의 사용법은 간단한데 


putchar(출력할문자); 


이런 식으로 사용합니다. 

예를 들자면 


char a='A'; 

putchar('a'); 

putchar(a); 


이런 식으로 쓰면 됨니다. 


(2) getch와 putch그리고 getche 

문자를 입출력하는 함수로는 getch,putch가 더 있는데, 

이것들은 conio.h에 정의되어 있습니다. 

getch함수는 한 문자를 입력받는 함수이고. 

putch는 한 문자를 출력하는 함수 입니다. 

사용법은 


변수=getch(); 

putch(출력할문자); 


이렇게 쓰는데 아까 꺼랑 똑같습니다. 

getchar과 getch의 다른 점은 getchar은 한 문자를 입력한 후 

Enter키를 눌려야 하지만. 

getch는 키보드에 문자 하나만 누르면 됨니다. 

그리고 getch로 입력할 경우 문자가 화면에 출려되지 않습니다. 

그런데 화면에 출력해야 할 경우가 생기는데, 

그럴땐 

getche함수를 쓰시면 됨니다. 

사용법은 getch와 똑같습니다. 단 입력 받은 문자열 화면에 출력하죠. 

그리고 putchar과 putch는 같다고 보시면 됨니다. 


3. 문자열 입출력 

문자열 입출력 함수인 gets와 puts에 대해 배워보죠. 

이 함수는 각각 문자열을 입력받고 출력하는 함수 입니다. 

사용법을 알아보면 


gets(변수); 


이렇게 사용하시면 됨니다. 

여기서 변수는 문자열을 저장할 변수 입니다. 

반드시 문자 배열이어야 하죠. 

그리고 gets로 문자열을 입력받을때는 

scanf와 다르게 공백이 있어도 상관 없습니다. 

puts함수는 


puts(출력할문자열); 


이렇게 쓰시면 됨니다. 

그리고 puts함수는 자동으로 문자열 끝에 

'\n'를 집어 넣어 출력 한다는 것을 잊지 마세요. 

즉 


printf("Example\n"); 


이렇게 할 것을 puts함수로 출력하면 


puts("Example"); 


이렇게 하면 된다는 것 입니다.. 


이제 예제 하나 볼까요? 


/* 파일 이름 : C5-1.C 

프로그램 내용 : 입출력 함수 예제. */ 

void main() 

{ 

int a; 

char b, str[100]; 


printf("Enter the Integer: "); 

scanf("%d%c",&a); 

printf("Enter the String: "); 

gets(str); 

printf("Enter the Character: "); 

b=getche(); 

putchar('\n'); 


printf("\n----------------------------\n"); 

printf(" Integer: %d\n",a); 

printf(" String: "); 

puts(str); 

printf(" Character: "); 

putchar(b); 

printf("\n----------------------------\n"); 

} 


이정도는 분석하실수 있겠죠? 

이것두 따로 설명은 하지 않겠습니다. 

결과는 어떻게 나올까요?????? 

결과는 


C:\>C5-1.EXE 

Enter the Integer: 10 

Enter the String: Example String 

Enter the Character: a 


---------------------------- 

Integer: 10 

String: Example String 

Character: a 

---------------------------- 


C:\>