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이 이미 주소이므로 &를 붙일 필요가 없습니다.
![char name[20] 배열에서 name이 시작 주소 200을 가리키고, Hello 문자열이 각 칸에 저장된 모습](/_next/image?url=%2Fcoding%2Fc-language%2Finput-functions%2Farray-name-address.webp&w=1920&q=75)
여러 값 동시 입력
하나의 scanf로 여러 값을 동시에 입력받을 수 있습니다.
서식 지정자와 전달하는 변수의 개수와 순서가 일치해야 합니다.
getchar() - 문자 한 개 입력 기초
getchar()는 키보드에서 문자(char) 하나를 입력받는 함수입니다. 출력 함수 putchar의 반대 역할입니다.
getchar는 인자가 없고, 입력받은 문자를 반환값 1으로 돌려줍니다. 그래서 & 없이 대입 연산자(=)로 변수에 저장합니다.
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); |
입력 함수에서 &와 주소 개념이 어렵게 느껴졌다면, 포인터 페이지에서 주소와 메모리의 관계를 더 자세히 배울 수 있습니다. 문자열 처리가 궁금하다면 문자열 페이지도 함께 읽어보세요.
정보처리기사 실기 대비 문제
Footnotes
-
함수가 실행을 마치고 결과를 돌려주는 값입니다.
getchar()는 입력받은 문자를,scanf()는 성공적으로 읽은 항목의 개수를 반환합니다. ↩