23.04.06 22:42 작성
·
626
1
안녕하세요, 공부하다 버퍼에 대한 궁금증이 생겨 질문드려요!
아래의 코드를 실행하고 콘솔에서 입력할 때, A(엔터'\n')3(공백)5(엔터'\n') 의 형식으로 입력하게 되면, A와 3 사이에 제가 입력한 엔터는 따로 버퍼 비우기를 하지 않았는데도 scanf를 만났을 때 문제를 일으키지 않는데요..! 그 이유를 알고 싶습니다.
강의 너무 잘 듣고 있고, 교수님 강의 덕에 c에 대해 더 본질적으로 알게 되는 것 같아 늘 감사드립니다!
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void display(char cr, int lines, int width);
int main()
{
char c;
int rows, cols;
printf("Input one character and two integers : \n");
while ((c = getchar()) != '\n')
{
scanf("%d %d", &rows, &cols);
while (getchar() != '\n') continue;
display(c, rows, cols);
printf("Input another character and two integers:\n");
printf("Press Enter to quit.\n");
}
return 0;
}
void display(char cr, int lines, int width)
{
for (int i = 0; i < lines; ++i)
{
for (int j = 0; j < width; ++j)
putchar(cr);
putchar('\n');
}
}
답변 1
2
안녕하세요, 답변 도우미 Soobak 입니다.
scanf()
함수는 기본적으로 공백 문자를 무시하고 처리하기 때문입니다. (일반적인 공백 문자 뿐만 아니라, \n
, \t
, \r
등의 문자를 포함하여 공백 문자라고 통칭하여 일컫습니다.)
공백 문자 관련 참고 자료(링크)
따라서, 말씀해주신 코드에서 첫 번째 getchar()
함수가 호출되어 입력으로 주어진 A
문자를 변수 c
에 저장한 이후 개행 문자는 입력 버퍼에 남아있지만, scanf()
함수를 scanf("%d(공백)%d, &rows, &cols)
형태로 호출하였기 때문에 해당 개행 문자를 무시하고 그 이후로 입력되는 3
과 공백
, 5
를 읽어 3
을 rows
에, 5
를 cols
변수에 저장합니다.
이후, while (getchar() != \n) continue ;
부분에서 입력 버퍼에 남아있는 개행문자들을 처리하게 됩니다.