C언어- getchar()함수를 쉽게 이해해보자!! (Let’s understand about getchar() easily!!)

필자가 정의하는 getchar()함수는 다음과 같다.

버퍼에 데이터가 있을 때! => 버퍼 가장 앞의 데이터를 반환한다

버퍼에 데이터가 없을 때! => 엔터(‘\n’)가 올 때까지 사용자로부터 문자를 받아서 버퍼에 저장하고 가장 앞의 데이터를 반환한다 < 만약 문자가 ‘1’ 이면 버퍼에는 ‘1’과 ‘\n’이 들어갔다가 ‘1’이 리턴됨 >

이때, 버퍼는 <문자형 큐>라고 생각하면 쉽다!!

getchar()함수를 연속으로 썼을 때 오류가 생긴다면 버퍼의 데이터 문제일 수 있다!!

int main(void) {
	char s1;
	getchar();
	s1=getchar();
}

=> 처음 getchar()에서 ‘h’입력 => 버퍼에 ‘\n’이 남음 => 두 번째 getchar()에서 ‘\n’이 나가고 s1에 저장 => 사용자가 이러한 상황을 모르면 혼동될 수 있음

따라서 getchar()를 하고 변수에 저장하지 않고 또 getchar()를 쓴다면 그 전에 초기화해주는 것이 좋다!!

버퍼 초기화 하는 법 =>

while (getchar() != '\n') {}
// 함수가 버퍼의 '\n'을 반환할 때까지 반복한다. (버퍼에 h|i|m|\n이 있었다면 => \n을 반환할 때 while조건 불충족 => 결국 버퍼가 초기화되고 while문이 끝나게 됨!!)

예제 1)

int main(void) {
	char s1;
	getchar();
	getchar();
	s1 = getchar();
	printf("%c", s1);
}

만약 사용자가 ‘h’를 입력했으면 첫 번째 getchar()에서 ‘h’가 반환되고 두 번째 getchar()에서 ‘\n’이 반환된다. 그 후 버퍼가 비었으니 세 번째 getchar()에서 사용자 입력을 받고 맨 처음 데이터를 반환해서 s1에 저장한다. 이후 s1을 출력한다!

예제 2)

int main(void) {
	char s1, s2, s3;
	s1=getchar();
	while (getchar() != '\n') {}
	s2=getchar();
	while (getchar() != '\n') {}
	s3 = getchar();
	while (getchar() != '\n') {}
	printf("출력:%c %c %c", s1,s2,s3);
}

첫 번째 getchar()에서 ‘e’를 입력하면 s1에는 ‘e’가 저장되고 버퍼에는 ‘\n’이 남는다. 이제 while문에 있는 getchar()에 의해 ‘\n’이 빠져 나가고 while문을 빠져 나온다.

두 번째 getchar()에서 ‘g’를 입력하면 s2에는 ‘g’가 저장되고 버퍼에는 ‘\n’이 남는다. 이제 while문에 있는 getchar()에 의해 ‘\n’이 빠져 나가고 while문을 빠져 나온다.

세 번째 getchar()에서 ‘g’를 입력하면 s3에는 ‘g’가 저장되고 버퍼에는 ‘\n’이 남는다. 이제 while문에 있는 getchar()에 의해 ‘\n’이 빠져 나가고 while문을 빠져 나온다.

예제1과 예제2까지 이해가 됐다면 다음 사항도 충분히 이해가 가능하다

예제 3)

int main(void) {
	char s[3];
	
	// 배열에 입력 받기
	for (int i = 0; i < 3; i++)
		s[i]=getchar();

	// 배열 원소 출력
	for (int i = 0; i < 3; i++)
		printf("%d번째 원소:%c\n",i,s[i]);

	// 남은 버퍼 데이터 수 출력
	int idx=0;
	while (getchar() != '\n')
		idx++;
	printf("버퍼에 남은 데이터 수: %d",++idx); //마지막 '\n'문자 포함
}

hello”를 입력하면 ‘h’, ‘e’, ‘l’은 배열에 저장되고 ‘l’, ‘o’, ‘\n’이 버퍼에 남는다!!

< I use Korean to save time on lecture or explanation. If you need an explanation, please send an email or comments!! >

Leave a Reply

Your email address will not be published. Required fields are marked *