인프런 커뮤니티 질문&답변

tjekqls7님의 프로필 이미지
tjekqls7

작성한 질문수

홍정모의 따라하며 배우는 C언어

8.5 숫자와 문자를 섞어서 입력받기

8.5 2분

작성

·

232

2

2분 경에 나오는 코드 관련해서 질문이 있습니다!!

교수님께서 입력하시는 걸 따라해보면서 디버깅을 해봤는데 이해가 가지 않는 부분이 있습니다 우선 제가 어떻게 이해했는지 한번 적어볼게요!! 읽어보시고 틀린 부분 있으면 지적해주세요!! (편의상 띄어쓰기는 (sp)라고 표기하겠습니다)

우선 scanf함수가 실행되어야 하는데 버퍼에 아무것도 없어서 사용자로부터 입력을 받습니다. 여기서 'a(sp)3(sp)3(sp)\n'을 입력하면 c, rows, cols에 a, 3, 3이 들어가게 되고 display 함수가 실행되어 a가 9개(3x3)이 출력됩니다.(앞에 있는 두개의 sp는 구분하는 기호로써 사용됨) 그 다음 if문을 지나게 되는데 c는 'a'이므로 조건에 부합하지 않아 무시하고 넘어갑니다.

다시 while문의 처음으로 돌아가서 scanf가 실행되어야 하는데 버퍼에 남아있는 게 '(sp)\n'밖에 없어 읽어들일 수 있는 정수형이 없기 때문에 사용자로부터 'b(sp)1(sp)2\n' 라고 입력받습니다.( Q1. 이 부분은 제가 추측한건데 이런 이유때문에 입력 받는 거 맞나요?? ) 그 후에 c는 '(sp)', rows는 3, cols는 3인 상태로 display함수를 통해 (sp)를 9개(3x3) 출력합니다.

Q2. 여기서 궁금한 게 있습니다!! 'b(sp)1(sp)2\n'라고 입력 받았는데 왜 rows랑 cols는 여전히 처음 받은 입력값 그대로인 건가요?

display(sp, 3, 3)가 실행되고 난 후 if문을 지나서 다시 while문의 처음으로 돌아갑니다.

Q3. 현재 버퍼에는 '\nb(sp)1(sp)2\n'이렇게 남아있는데 디버깅을 해보니까 c에는 b가, rows에는 1, cols에는 2가 들어가더라구요.. 왜 c에 \n이 들어가는 게 아니라 b가 들어가는거죠? 

b를 2개(1x2) 출력하고 난 후 다시 if문을 거쳐 scanf로 돌아갑니다. 그런데 읽어들일 정수형이 버퍼에 없어 사용자로부터 'c(sp)2(sp)1\n'을 입력받습니다. (여기는 교수님께서 입력 안하셨길래 제가 임의로 입력했습니다) 현재 버퍼에는 '\nc(sp)2(sp)1\n'이 있어서 c에는 \n, rows에는 2, cols에는 1이 들어가게 됩니다. display(\n , 2, 1)이 실행되어 \n이 4개 출력되고, if문을 만족시켜서 while문을 탈출하게 되고 프로그램이 종료됩니다.

여기까지가 제가 이해한 내용이고 중간에 틀린 부분 있으면 지적해주세요!!

c언어는 포인터가 어렵다고 들었는데 왜 저는 버퍼랑 입력함수에서 헤매고 있을까요..ㅠㅠ

답변 3

3

tjekqls7님의 프로필 이미지
tjekqls7
질문자

헐 진짜 저거 실행해봤더니 감이 와요.. 너무 신기해요 왜 오류가 그렇게 났는지 알 것 같아요 제가 제 질문에 이해한 걸 토대로 답해보자면

Q1. 이 부분은 제가 추측한 게 맞는 것 같아요 선생님께서 주신 코드에서도 scanf가 처음에 정수형 하나를 입력으로 받고 버퍼에 \n밖에 없으니까 다시 입력을 달라고 깜빡거린거처럼요..

Q2. scanf는 정수형을 원한건데 문자가 들어오니까 그대로 종료해버려서 결국 띄어쓰기와 원래 변수에 들어있던 3, 3이 그대로 display로 들어가 실행된 것 같아요

Q3. 여기는 좀 긴가민가해요.. 일단 버퍼에서 \n이 사라지고 아예 b,1,2만 남아있어서 저렇게 실행된 것 같아요. 위에 2번 질문과 연결되는데 scanf가 일단 버퍼에 '(sp)\n'만 남아있는 상태에서 문자로 sp를 읽어들여 c에 저장하고, 정수형이 없으니까 콘솔창을 통해 읽어들이려고 \n을 삭제한 것 같아요.. 결국 정수형이 아니라 문자가 들어와서 무시해버렸지만, 일단은 버퍼에서 사라진 게 아니니까 그 다음 루프에서 scanf가 b, 1, 2를 읽어들이고.. 제가 이해한 게 맞나요??

버퍼 배우니까 왜 c언어를 로우레벨 언어라고 하는지 알 것 같아요..

2

잘 이해하셔서 다행이네요 :)
다음 번에는 직접 간단한 코드를 작성해서 확인해보셨으면 좋겠습니다.

1

안녕하세요?
scanf가 예외에 대해서 어떻게 행동하는지에 초점을 맞추시는게 좋을 것 같습니다.
그리고 문제라고 생각되는 것을 확인할 코드를 직접 짜보시는 것이 도움이 됩니다.
scanf("%d" ...) 의 경우에 'a' 와 같은 정수가 아닌 입력이 들어오면 그대로 종료해버립니다. 이 때 입력은 버퍼에 남겨둡니다.
아래의 코드에서 아무 정수나 하나 입력으로 넣은 후 문자 하나를 입력으로 넣어보세요.
이 점을 염두해두시고 다시 고민해보시면 해결될 문제로 보이네요.
제가 느낀 점으로는 버퍼에서도 질문이 많습니다. 이 점은 크게 걱정하지 마세요.

#include <stdio.h>
int main(int argc, char* argv[])
{
	int a = 0;
	while (1)
	{
		scanf("%d", &a);
		printf("%d\n", a);
	}
	return 0;
}

tjekqls7님의 프로필 이미지
tjekqls7

작성한 질문수

질문하기