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

권태완님의 프로필 이미지
권태완

작성한 질문수

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

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

Buffer 질문 있읍니다.

작성

·

152

0

#include <stdio.h>

void display (char cr, int lines, int width)

{

    int row, col;

    

    for (row = 1; row <= lines; row++)

    {

        for (col = 1; col <= width; col++)

            putchar(cr);

        putchar('\n');

    }

}

int main()

{

    char c;

    int rows, cols;

    

    while (1)

    {

        scanf("%c %d %d", &c, &rows, &cols);

        //while (getchar() != '\n') continue;

        //{

        display (c, rows, cols);

        if (c == '\n')

            break;

        //}

    }

}

(space는 (sp)로 표기하겠습니다.

질문 1) A(sp)3(sp)3A(sp)3(sp)3(sp)(Enter) B(sp)1(sp)2(sp)(Enter) 을 입력하면 3분 5초의 결과 값이 나오게 됩니다. 이러한 결과가 나오게되는 과정이 맞는지 확인해 주세요. (ASCII code로 쓰지는 않겠습니다.)

A(sp)3(sp)3(sp)(Enter) 후 buffer에 [A, (sp), 3, (sp), 3, (sp), \n] 이 저장되어 있다.

While문이 한번 돌고 buffer에는 [(sp), \n]이 존재한다. c주소에는 A, rows주소에는 3, cols 주소에는 3이 저장되어 있다.

두번째 while문이 시작된다. buffer에 값이 있으므로 scanf함수가 c 주소에 (sp)를 저장한다. scanf함수가 \n도 가지고 오려 하지만 \n의 자료형이 정수가 아님으로 scanf 함수가 종료됩니다. 따라서 c 주소에 (sp), rows 주소에 3, cols주소에 3이 저장된 채로 display함수가 실행 됩니다. 따라서 3*3의 공백이 출력 됩니다.

세번째 while문이 시작됩니다. buffer가 비었음으로 scanf가 자료를 읍력 받습니다. 따라서 buffer에 [B, (sp), 1, (sp), 2, (sp), \n]가 저장되고 그후는 첫번째 while문이 실행될때랑 똑같습니다. 따라서 결과로는 3분 5초의 결과 값과 같이 나옵니다.

질문 2) 질문 1에서 두 번째 while문 일때 3*3 공백이 출력 되어야 하는데 왜 3번째 while 문이 작동할때 Enter을 누른뒤 3*3 공백과 2 * 1 B가 출력 되는 것인가요?

질문 3) while(getchar() != '\n') 

                continue;

코드가 어떻게 buffer을 초기화 시켜주는 것인가요? continue 때문인가요?

감사합니다.

답변 1

0

질문1)

첫번째 두번째 while 문은 맞는데, 세번째 while 문 정정하고 싶습니다. 

첫번째 while 문 :

버퍼 상태 [ A, 공백, 3, 공백, 3, 공백, \n ] 

c rows cols 에 입력한 후 버퍼 상태 [ 공백, \n ]

두번째 while 문 :

버퍼 상태 [ 공백, \n ] 버퍼엔 2개가 들어있으나 입력은 3개 받으니까 사용자 입력을 더 받아야합니다. 콘솔 입력이 활성화 됩니다. -> 버퍼 상태 [ 공백, \n, B, 공백, 1, 공백, 2, 공백, \n ] 

c rows cols 에 입력한 후 버퍼 상태 [ B, 공백, 1, 공백, 2, 공백, \n ] c 에 공백이 들어간 후 질문자님 말씀처럼 rows 는 \n 을 받을 수 없기에 scanf 가 종료됩니다. (다만 \n는 버퍼에서 빼내어 버립니다. 버퍼에서 빼내서 확인해 보니 rows 타입에 맞지 않아서 입력 안하고 버린 것이거든요) 즉, 공백 \n 만 기존 버퍼에서 빠졌습니다. scanf 가 입력을 받아들여 저장에 성공한건 c 뿐입니다. c 에 공백 문자가 들어갑니다. rows 와 cols 는 입력이 진행되지 않았으므로 첫번째 while문에서 입력받았던 3, 3 상태 그대로입니다. 따라서 이때 display 함수를 통해 3 * 3 크기의 공백이 출력됩니다. (질문 2 에서 왜 3 * 3 크기의 공백이 세번째 while 문에서 출력되냐고 말씀해주셨는데, 제가 디버깅 해보니 이 부분은 예상하신 것 대로 두번째 while 문에서 잘 출력됩니다. 세번째 while 문에서 출력하는건 BB 뿐입니다.)

세번째 while 문 :

버퍼 상태  [ B, 공백, 1, 공백, 2, 공백, \n ]  -> 이와 같이 비어있지 않습니다. (세번째 while 문에서 버퍼가 비어있기 때문에 입력 받는다고 말씀하셔서 이 부분 정정해드립니다.)

이미 버퍼에 입력으로 가져올게 있기에 콘솔 입력이 딱히 활성화되지 않습니다. [ B, 공백, 1, 공백, 2, 공백, \n ] 버퍼 상태가 완성되는건 세번째 while문에서가 아닌 두번째 while 문 에서였습니다. 

디버깅으로 코드 실행 과정을 차례대로 확인할 수 있으니 꼭 디버깅 해보세요! 

질문2) 위에서 답변 드렸습니다. 해당 공백 출력 부분은 세번째 while문이 아닌 두번째 while문에서 출력됩니다.

질문3) 제가 이건 다른 질문글에서 여러번 답변드린적이 있어서 링크들로 대신하겟습니다~! 간단히 말씀드리자면 getchar() 로 버퍼에서 읽고 버리는 짓을 반복해서 비워지는거에요. 

https://www.inflearn.com/questions/100574

https://www.inflearn.com/questions/142451

권태완님의 프로필 이미지
권태완

작성한 질문수

질문하기