inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

Buffer 질문 있읍니다.

176

권태완

작성한 질문수 6

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 때문인가요?

감사합니다.

c

답변 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

Export template 안됨

1

62

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

88

3

main 함수에서 왜 int만 선언이 되는걸까요

1

78

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

74

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

77

1

프로토타입과 함수간의 인자 불일치

1

86

2

12.12 헤더 관련 질문

1

74

2

Visual Studio Community 2026 사용 문의

1

167

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

71

2

getchar(), putchar()

1

110

3

강의자리ㅛ

1

92

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

127

2

소스파일안에 여러 파일

1

87

2

F5와 F7의 차이

1

90

2

c = TWO * (a+b); 에서 a와 b는?

1

67

2

; 세미콜론을 붙이는 기준에 문의

1

78

1

Step over 기능 문의

1

64

2

2.6 강의 따옴표 출력 규칙 문의

1

87

2

int main 함수 관련 오류 문의

1

76

2

13.4 words[0]

0

73

2

11.7 함수를 구현해 봤습니다.

1

67

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

71

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

60

2

11.6 fit_str함수를 구현해 봤습니다.

1

58

2