• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

scanf와 whitespace 관련 질문드립니다.

21.01.28 23:26 작성 조회수 452

0

안녕하세요:)

scanf도 getchar() 처럼 입력 받은 것을 버퍼에 넣어놓는다고 하셨는데요. getchar은 띄어쓰기도 하나의 문자로 입력 받는 것을 볼 수 있었습니다. 예를 들면 

ab c를 입력 했을 때 a/b/ /c 이렇게 네 개가 입력이 되듯이 말이죠.

그렇다면 scanf도 

scanf("%d %d", &rows, &cols); 
while (getchar() != '\n') continue;

에서 예를 들어, 5 2라고 입력 받았다면 5/ /2 이렇게 띄어쓰기를 포함해 세 개를 입력 받게 될텐데요. 이때는 띄어쓰기가 두번째 %d로 들어가지 않고 띄어쓰기를 무시하고 2가 대신 들어갑니다.

이전의 다른 분 질문 답변에서 

"scanf는 %c 로 받지 않는 이상은 whitespace를 무시합니다. "

라고 하셔서 무시한다는 것은 알았습니다. 

그런데 이와 같이 무시하는 것이 입력받은 것과 scanf에서 입력받은 %(자료형)이 서로 맞지 않을 경우, whitespace 뿐만 아니라 모두 무시하는 것인가요?

아니면 특별히 whitespace만 무시하는 것인지 궁금합니다.

감사합니다!

답변 1

답변을 작성해보세요.

1

안소님의 프로필

안소

2021.01.28

안녕하세요.

"입력받은 것과 scanf에서 입력받은 %(자료형)이 서로 맞지 않을 경우, whitespace 뿐만 아니라 모두 무시하는 것인가요?"

이 말씀이 맞습니다.

scanf("%d", n) 이런 형태일 경우, 십진수 숫자만 n에 입력시키라고 지시해준 것이나 마찬가지입니다. 따라서 십진수 숫자가 아닌건 무시합니다. 공백 문자같은 whitespace는 숫자 형태가 아니니 당연히 무시가 됩니다. 이땐 그냥 '가', 'a' 이런 문자도 무시 되어 n에 입력되지 못합니다. 숫자가 아니니까요!

그러나 whitespace 는 문자이기도 합니다. 엄연히 아스키코드표에 있는 하나의 char 문자이기도 합니다. 그러니 scanf("%c", c) 이렇게 %c로 입력 받을 땐 무시되지 않고 c 에 공백 문자 또한 잘 입력되는 것입니다. 문자니까요! 이 같은 원리로 getchar도 char를 입력 받는 함수기 때문에 공백 입력이 문제 없었던 것입니다. 

이처럼 입력할 것을 지정한 % 지시자 타입과 맞지 않는 것은 무시할 뿐입니다.