프로그래밍 언어/C언어

[C언어 #5] 표준 입력 함수 (getchar, getc, gets, scanf)

디버그러 2024. 11. 28. 17:46

표준 입력 함수를 사용하려면 프로젝트 상단에 #include <stdio.h>를 작성해야 합니다.

표준 출력 함수(putc, printf 등)와 비슷하지만 포인터에 대한 개념이 필요합니다.

 

 

 


 

 

1. 단일 문자 입력 함수 getchar

 

getchar는 get + character를 합친 단어입니다.

단일 문자를 입력받고 이를 int 형식으로 반환합니다.

 

 

알파벳이나 숫자와 같은 대부분의 입력 문자는 1바이트 크기이므로, 반환값을 char 변수로도 받을 수 있습니다.

하지만 getchar는 특정 상황에서 문제가 생길 수 있습니다.

 

 

 

1번째 입력 후에 누른 엔터키가 2번째 호출에서 입력으로 처리됩니다.

이로 인해 2번째 출력은 원치 않는 결과를 출력할 수 있습니다.

 

 

 

이를 해결하기 위해 입력 버퍼를 초기화해야 합니다.

C언어에서는 rewind(stdin)을 사용하여 표준 입력 스트림(stdin)을 초기화할 수 있습니다.

 

 

 


 

 

2. 단일 문자 입력 함수 getc

 

getc 역시 get + character를 합친 단어입니다.

단일 문자를 입력받을 수 있으며, int 형식으로 데이터를 반환합니다.

getchar와 유사하지만, 파일 스트림을 인자로 받는 점에서 차이가 있습니다.

 

 

여기서 stdin은 표준 입력 스트림을 의미하며, 입력을 받는 장치(보통 키보드)를 나타냅니다.

실제로 getchar는 getc(stdin)으로 정의된 간단한 버전이라고 볼 수 있습니다.

따라서 파일 입력이나 표준 입력에 따라 getc를 더 일반적으로 사용할 수 있습니다.

 

 

 


 

 

3. 문자열 입력 함수 gets_s

 

gets는 get + string을 합친 단어입니다.

문자열을 입력받는 함수이며, 엔터키를 누를 때까지 입력된 모든 문자를 하나의 문자열로 간주하고 공백도 문자열로 포함됩니다.

최신 버전의 visual studio에서는 보안 문제로 인해 gets 함수가 아닌 gets_s 함수로 사용해야 합니다.

 

<주의점 및 특징>

- gets_s 함수는 배열의 시작 주소를 매개 변수로 받습니다.
- 입력된 문자열이 배열의 크기를 초과하지 않도록 해야 합니다.
- 배열 이름은 시작 주소로 암묵적으로 변환되므로 data는 &data[0]과 같은 의미로 처리됩니다

 

 

 

gets_s는 입력 버퍼의 엔터키를 처리하기 때문에, 위의 getchar와 달리 rewind(stdin)을 사용할 필요가 없습니다.

 

 

 


 

 

4. 문자열 입력 함수 scanf

 

scanf는 scan + format을 합친 단어로, 다양한 형식(format)의 데이터를 입력받을 수 있는 범용적인 표준 입력 함수입니다.

이 함수는 printf와 유사하게 형식 지정자를 사용합니다.

 

<주의점 및 특징>

- scanf는 변수의 주소를 요구하므로 & 연산자를 사용해야 합니다.
- 입력값이 스페이스, 엔터키, 탭 등을 포함하면 그 전까지의 유효한 데이터만 읽어옵니다.
- 문자열 입력 시 공백이 포함된 경우, 공백 전까지만 읽습니다.

 

 

 

scanf 함수는 입력에 오류가 있으면 0을 반환합니다.

이를 이용해 오류를 감지하고 rewind(stdin)을 이용해 입력 버퍼를 초기화할 수 있습니다.