211001, C언어 입문 - day 10-1

Min Hyeok·2021년 10월 1일
0

C언어 개념 익히기

목록 보기
11/19

왜 9월 17일 이후 글이 10월 1일이냐고요?
어..
추석때 빨간날이라 놀았고요.. 이틀전까지 일주일동안 서울다녀왔읍니다..
면목없읍니다.
그래서, 다시 오늘부터 달리기로..!

14장, 표준 입력 함수

표준 입력이란게 무시기냐.
지금 내가 입력하는 키보드나, 이 키보드 옆에 있는 마우스 같은걸로 입력하는거. 그걸 "표준 입력"이라고 한다. 그리고 내가 이 입력한 것을 특정 키를 누를 때 까지, 사용자의 입력을 임시로 저장해주는 공간을 "표준 입력 버퍼"라고 하고.

만약 내가 카톡 채팅을 하고 있다 가정하자. 그러면 "ㄹㅇㅋㅋ"라고 치면 그게 표준입력이고, 이 ㄹㅇㅋㅋ를 임시로 저장하고 있는 공간을 표준 입력 버퍼라고 한다. 그리고 "특정 키"는 채팅을 보내는 엔터키나 전송버튼이 될거고. understand?

근데 이 특정키와 표준입력함수가 잘 맞지 않는다면, 오류가 생길수도 있다. 만약 한개의 글자만 입력받는 getchar함수를 사용했는데, 내가 abc라고 입력을 했다? 그러면 첫 enter키에서는 무사히 "a"가 뽑혀서 getchar에 불려가겠지. 근데 입력버퍼에는 "abc"가 저장이 되었다. a가 뽑혀나갔다고 해서 나머지애들이 알아서 불려나가진 않았단 거지. 만약 내가 첫 입력땐 abc, 두번째 입력땐 def를 입력하면, 내가 "ad"를 결과로 산출하고 싶다고 해도 아직 표준입력버퍼엔 "bc"가 "def"보다 먼저 남아있기때문에 b가 입력되었다고 처리를 해버린다.

이걸 없애는게 rewind함수가 있음.

rewind(stdin);

이렇게 적으면 입력 버퍼를 초기화 할 수 있다.

그러면 이제 자주 사용되는 표준 입력 함수들을 한번 알아볼까.

1. getchar
문자를 하나 입력받는다. 그리고, int형식으로 데이터를 반환한다. (원한다면 char로 받고..~)

#include <stdio.h>

int main() {
    int input;
    input = getchar();
    printf("input : %c\n", input);
}

요로코롬. 만약 내가 a를 입력하면 a가 나온다.

아 그리고, 만약 내가 동시에 getchar함수를 연속으로 두번쓰면, 오류가 생길 수도 있다.

input = getchar();
input = getchar();

이렇게 하면, 첫번째 입력 a, 두번째 입력 b를 따로 입력을 해주어야 하는데, 첫번째 입력 a만 누르고 엔터를 누르면 바로 프로그램이 끝나버린다. 왜냐고?

우리가 입력을 완료할 때 누르는 엔터때문이다. 엔터를 두번째 입력으로 인식해버리고 끝내버리는 것. 이런 문제점을 해결하려면 앞에서 배운걸 써먹으면 된다.

input = getchar();
rewind(stdin);
input = getchar();
rewind(stdin);

이렇게 하면, 엔터키를 누르는 두번째 입력까지 가고, 입력 버퍼가 초기화되며 다시 한번 더 입력을 받을 수 있게된다.

2. getc
얘를 사용하기 편하게 만든게 getchar다. 컷.

3. gets
얘는 문자"열"을 입력받는다. get string을 줄여서 gets가 된 것이랄까.

char input[10];
gets(input);

이렇게 써주면 됨. 얜 앞에 getchar랑 다르게 똑똑해서 혼자 엔터키까지 처리한다. 그래서 rewind 굳이 쓸 필요 없음.

대신에 문자 열이다 보니, 프로그램 중지를 의미하는 Ctrl + C를 입력했을때 입력을 취소시키게 코드를 짤수도 있어야한다.

char input[10];
if (NULL != gets(input)) {
    printf("%s\n", input);
} else {
    printf("CANCELED!\n");
}

이렇게 짜면 된다. 만약 내가 ctrl + c를 누르면, 입력 버퍼엔 아무것도 안 남아있어서 NULL값 (아무 값도 존재하지 않음)이 된다. 그걸 활용한 코드임.

일단 여기까지. 14-3, 14-4는 내일 해야겠다. 백준땡겨!

0개의 댓글