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

Echapper4님의 프로필 이미지
Echapper4

작성한 질문수

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

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

scanf & 버퍼

작성

·

219

·

수정됨

1

안녕하세요

강의의 최종 코드 중 일부입니다.


...
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);
...

여기서 A 3 2(엔터)를 입력하면 상단의 c=getchar()에 의해 getchar이 A를 가져가고 버퍼는 |A 3 2\n| 에서 | 3 2\n| 로 변하게 됩니다.(띄어쓰기 유의)

 

그다음 scanf("%d %d", &rows, &cols); 는 버퍼의 맨 앞의 띄어쓰기를 읽어야 하지 않나요? 그런데 아시다시피 scanf가 입력버퍼에서 읽는 것은 3과 2입니다.

 

scanf가 띄어쓰기를 읽는다고 알고 있는데 3앞의 공백이 어떻게 처리된건지 궁금합니다.

 

감사합니다.

답변 1

2

안녕하세요, 답변 도우미 Soobak 입니다.

 

scanf() 함수의 형식 지정자 중 %d 형식 지정자의 경우, 공백(space), 탭, 개행 문자와 같은 모든 공백 문자들을 자동으로 무시하기 때문입니다. 형식 지정자 %c 와 같은 경우에는 공백 문자를 포함하여 모든 문자를 읽어들이고 저장하지만, 그렇지 않은 형식 지정자들도 있습니다.

따라서, 버퍼에서 처음으로 만나는 공백을 무시하고, 첫 번째 비공백 문자인 32rowscols 에 각각 저장합니다.

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

이해 잘 됐어요 감사합니다!

그리고 하나 궁금한 게 더 있는데

getchar()는 버퍼 칸을 읽음과 동시에 그 버퍼칸을 비우나요? 그렇게 돼서 앞당겨지는건가요?

안녕하세요, 답변 도우미 Soobak 입니다.

 

getchar() 함수는 입력 스트림(표준 입력 버퍼 포함)에서 현재 문자를 읽고, 그 문자를 반환합니다.
문자를 읽은 후에 버퍼를 비우지는 않습니다.

 

다만, 버퍼 내에서 현재 인덱스(읽기 위치)를 다음 문자의 위치로 이동시킵니다.

즉, getchar() 함수는 버퍼 내부의 현재 인덱스에 위치한 문자를 반환하고, 버퍼의 인덱스는 다음 문자의 위치로 이동합니다.

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

감사합니다 :b

Echapper4님의 프로필 이미지
Echapper4

작성한 질문수

질문하기