C언어 입력 함수 - scanf, getchar, gets
요약
C언어의 입력 함수 scanf, getchar, gets의 사용법과 차이점을 알아봅니다. scanf에서 주소 연산자(&)를 사용하는 이유와 서식 지정자를 정보처리기사 실기 대비 핵심 내용으로 정리합니다.
입력 함수 핵심 정리
| 함수 | 설명 | 사용법 | 입력 |
|---|---|---|---|
scanf(fmt, ...) | 서식 지정하여 입력 | scanf("%d", &a); | 정수, 실수, 문자 등 |
getchar() | 문자 한 개 입력 | ch = getchar(); | 문자 1개 |
gets(str) | 문자열 입력 (줄 단위) | gets(name); | 공백 포함 문자열 |
세 함수 모두 stdio.h 헤더에 선언되어 있으므로 #include <stdio.h>가 필요합니다.
함수 이름의 의미
C 표준 라이브러리에서는 입력 함수에 get(가져오다), 출력 함수에 put(내보내다)을 관례적으로 사용합니다.
| 함수 | 이름 유래 | 의미 |
|---|---|---|
scanf | scan + formatted | 서식을 지정하여 입력 |
getchar | get + character | 문자 하나를 입력 |
gets | get + string | 문자열을 입력 |
scanf() - 서식 지정 입력
scanf()는 서식 지정자를 사용하여 키보드에서 데이터를 입력받는 함수입니다. C언어에서 가장 많이 사용하는 입력 함수입니다.
scanf의 서식 지정자
출력 함수 printf와 같은 서식 지정자를 사용합니다.
| 서식 지정자 | 의미 | 입력 예시 |
|---|---|---|
%d | 정수 (10진수) | scanf("%d", &n); |
%c | 문자 한 개 | scanf("%c", &ch); |
%s | 문자열 | scanf("%s", str); |
%f | 실수 (소수점) | scanf("%f", &x); |
%lf | double형 실수 | scanf("%lf", &y); |
scanf에서 &를 붙이는 이유
scanf의 두 번째 인자부터는 변수 앞에 &(주소 연산자)를 붙여야 합니다.
scanf는 키보드에서 입력받은 값을 변수에 직접 저장해야 합니다. 그런데 C언어에서 함수에 변수를 그대로 전달하면 값의 복사본만 전달되기 때문에, 원본 변수의 값을 바꿀 수 없습니다.
그래서 scanf에는 변수의 주소를 전달합니다. 주소를 알면 해당 메모리 위치에 직접 값을 쓸 수 있기 때문입니다.
| 코드 | 의미 |
|---|---|
a | 변수 a의 값 |
&a | 변수 a의 주소 (메모리에서 a가 저장된 위치) |
scanf("%d", &a) | a의 주소에 정수를 입력받아 저장 |
문자열 입력 시 &가 필요 없는 이유
%s로 문자열을 입력받을 때는 &를 붙이지 않습니다.
배열의 이름은 그 자체가 배열의 시작 주소이기 때문입니다. name이 이미 주소이므로 &를 붙일 필요가 없습니다.
여러 값 동시 입력
하나의 scanf로 여러 값을 동시에 입력받을 수 있습니다.
서식 지정자와 전달하는 변수의 개수와 순서가 일치해야 합니다.
getchar() - 문자 한 개 입력
getchar()는 키보드에서 문자(char) 하나를 입력받는 함수입니다. 출력 함수 putchar의 반대 역할입니다.
getchar는 인자가 없고, 입력받은 문자를 반환값으로 돌려줍니다. 그래서 & 없이 대입 연산자(=)로 변수에 저장합니다.
getchar 예시
getchar vs scanf 비교
문자 한 개를 입력받을 때 getchar()와 scanf("%c", &ch)는 동일한 결과를 냅니다.
| 구분 | getchar | scanf |
|---|---|---|
| 입력 단위 | 문자 한 개 | 다양한 형식 |
| 서식 지정 | 불가 | 가능 (%d, %c, %s 등) |
| 사용법 | ch = getchar(); | scanf("%c", &ch); |
gets() - 문자열 입력
gets()는 키보드에서 한 줄의 문자열을 입력받는 함수입니다. scanf("%s")와 달리 공백을 포함한 문자열을 입력받을 수 있습니다.
gets vs scanf 비교
| 구분 | gets | scanf("%s") |
|---|---|---|
| 공백 처리 | 공백 포함 입력 | 공백 전까지만 입력 |
| 입력 단위 | 한 줄 전체 | 공백/줄바꿈 전까지 |
| 사용 예 | gets(name); | scanf("%s", name); |
입력 함수 비교 정리
| 구분 | scanf | getchar | gets |
|---|---|---|---|
| 입력 단위 | 다양한 형식 | 문자 한 개 | 문자열 (한 줄) |
| 서식 지정 | 가능 | 불가 | 불가 |
| 공백 처리 | %s는 공백 전까지 | 공백도 입력 가능 | 공백 포함 입력 |
& 사용 | 필요 (문자열 제외) | 불필요 (반환값 사용) | 불필요 (배열 이름 = 주소) |
| 사용 예 | scanf("%d", &a); | ch = getchar(); | gets(str); |