3:20 getchar()
왜 갑자기 getchar() 이 나오는 건지 모르겠어요.
getchar가 아니라 scanf로 입력받았던 건데 왜 갑자기 getchar가 나오나요?
Answer 2
5
scanf같은 입력함수들은 내부의 버퍼에 임으로 담겨졌다가, 사용시 끄집어내서 사용하는 방식입니다.
자세한 것은 입력함수들이 정의된 내용을 보아 동작방식을 알아야하나 이것은 너무 고급교육이고,
입력을 받을 때, int, float 등과 같은 숫자형은 '\n'자같은 개행문자들을 무시하고 출력하게 됩니다.
하지만 문자가 입력될때는 전혀 다른이야기가 되는데요,
보통 scanf 함수 쓰면서 앤터를 입력하시고 값을 입력하시는 경우가 있지요?
예를 들어서
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
가 있을 때, 입력할때
a값 입력 - > 앤터 -> b값 입력 -> 앤터를 입력해보세요.
b값은 입력을 받지않고 바로 넘어가게 될겁니다.
왜냐, 과정을 보면은 'a'를 입력했습니다.
버퍼 ㅣ 'a' |
그리고 앤터를 쳤습니다.
버퍼 | 'a' | | '\n' |
중요한 것은 변수 a에 'a'가 들어가게 되면서,
버퍼 |'\n'|
가 되는데 버퍼에 '\n' 개행문자가 남게 됩니다. 이것도 (char)형에선 문자죠.
그렇기 때문에 scanf의 b값 입력이 시작될 때, b값에 자동적으로 버퍼에 남은 '\n'이 들어가게 됩니다.
그래서 우리 눈에는 b값이 입력이 안된것 처럼 보일 뿐이죠.
실제론 a = 'a', b = '\n' 가 되버린 상황인 겁니다.
이것을 해결하기 위해선, 버퍼를 비우거나, 문자를 입력받는 getchar함수를 이용하는 겁니다.
버퍼를 비우는데는 fflush()같은 함수도 있지만 제가 알기론 공식 함수가 아닌것으로 알고(컴파일러에 따라 fllush가 작동 할 수 있고 안할수도 있음.), 그래서 getchar()를 쓰는데,
getchar 함수는 입력한 문자 하나를 반환하는 형식입니다.
int a = getchar();
를 하면 문자하나가 a에 들어갈겁니다.
즉,
char a;
char b;
scanf("%c",&a);
getchar();
scanf("%c",&b);
아까와 같은 코드에서 getchar가 들어갔죠? 위의 문제가 되던 시점부터 보면,
버퍼 | 'a' | | '\n' |
a에 'a'가 들어갑니다.
버퍼 | '\n' |
에서 getchar함수가 '\n'을 받습니다. 그러나 getchar()도 문자를 반환하지만 따로 저장할 변수를 마련하지 않아서 그냥 버려집니다.
버퍼 ||
그럼 버퍼가 비워지고, scanf("%d",&b)가 실행됩니다.
비어져있기 때문에 자동으로 b값에 무언가 들어가지 않습니다.
이상태에서 입력해주면 정상적으로 b값에 들어갑니다.
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
52
3
main 함수에서 왜 int만 선언이 되는걸까요
1
56
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
54
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
49
1
프로토타입과 함수간의 인자 불일치
1
73
2
12.12 헤더 관련 질문
1
60
2
Visual Studio Community 2026 사용 문의
1
137
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
60
2
getchar(), putchar()
1
93
3
강의자리ㅛ
1
79
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
112
2
소스파일안에 여러 파일
1
75
2
F5와 F7의 차이
1
76
2
c = TWO * (a+b); 에서 a와 b는?
1
58
2
; 세미콜론을 붙이는 기준에 문의
1
68
1
Step over 기능 문의
1
53
2
2.6 강의 따옴표 출력 규칙 문의
1
74
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
60
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
64
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
53
2
11.5 코드 구현
1
67
2

