C 언어에서 scanf() 함수와 gets() 함수는 모두 외부 소스(키보드)로부터 입력을 받아 시스템에 전달하기 위해 정의된 표준 입력 함수입니다. 두 함수는 비슷한 용도로 사용되지만, 내부 동작 방식과 특성에는 몇 가지 중요한 차이점이 존재합니다.
아래 표에서 C 언어의 scanf()와 gets() 함수 간의 핵심적인 차이점을 확인해 보세요.
| 번호 | 구분 | scanf() 함수 | gets() 함수 |
|---|---|---|---|
| 1 | 정의 | 키보드로부터 입력을 읽어 지정된 형식 지정자(format specifier)에 따라 저장합니다. 공백, 줄바꿈(newline) 또는 EOF를 만나면 입력 읽기를 중단합니다. | 줄바꿈(newline) 또는 EOF를 만날 때까지 키보드로부터 입력을 받습니다. 공백은 입력값의 일부로 간주됩니다. |
| 2 | 공백(WhiteSpace) | 공백 문자를 입력 문자로 취급하지 않으며, 입력 도중 공백을 만나면 외부 소스로부터의 읽기를 중단합니다. | 공백을 입력 문자로 취급하며, 입력 도중 공백을 만나더라도 읽기를 멈추지 않고 계속해서 입력을 받아들입니다. |
| 3 | 문법(Syntax) | 형식 문자열과 변수의 주소 목록을 인수로 받습니다. 예: scanf("%d", &number); | 입력받은 값을 저장할 변수의 이름만 인수로 받습니다. 예: gets(name); |
| 4 | 데이터 타입(DataType) | 서로 다른 데이터 타입의 여러 값을 한 번에 읽을 수 있습니다. | 오직 문자열(character string) 데이터만 입력받을 수 있습니다. |
차이점 상세 설명
1. 정의 및 기본 동작
scanf()는 형식 지정자를 기반으로 입력을 해석하며, 공백·줄바꿈·EOF를 만나는 순간 해당 항목의 읽기를 종료합니다. 반면 gets()는 줄바꿈 문자를 만나기 전까지 한 줄 전체를 문자열로 읽어들이며, 그 과정에서 공백도 입력값의 일부로 포함됩니다.
2. 공백 처리 방식
scanf()는 공백 문자를 구분자(delimiter)로 취급하기 때문에 "Hello World"처럼 공백이 포함된 문자열을 입력하면 "Hello"까지만 저장됩니다. 반면 gets()는 공백을 포함한 전체 문장을 하나의 문자열로 저장할 수 있습니다.
3. 문법과 매개변수
scanf()는 형식 문자열과 함께 변수의 주소(& 연산자)를 인수로 전달해야 합니다.
scanf("%d", &number);
반면 gets()는 값을 저장할 문자열 배열의 이름만 전달하면 되므로 사용법이 더 간단합니다.
gets(name);
4. 처리 가능한 데이터 타입
scanf()는 %d, %f, %s 등 다양한 형식 지정자를 통해 정수, 실수, 문자열 등 여러 데이터 타입을 유연하게 읽을 수 있습니다. 반면 gets()는 문자열만 입력받을 수 있어 활용 범위가 제한적입니다.
참고: gets() 함수의 보안 문제
gets() 함수는 입력 크기를 제한할 수 없어 버퍼 오버플로우(buffer overflow) 취약점이 존재한다는 점도 알아두어야 합니다. 이러한 이유로 C11 표준에서는 gets() 함수가 공식적으로 제거되었으며, 실제 개발 환경에서는 fgets()와 같은 안전한 대안 함수를 사용하는 것이 권장됩니다.