• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

cin.ignore에 입력값의 차이가 궁금합니다, cin.clear 후 ignore 또 해주는이유도 궁금합니다.

23.04.22 17:14 작성 23.04.22 17:20 수정 조회수 854

2

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

int getInt()

{

cout << "Enter an integer number : ";

int x;

cin >> x;

cin.ignore(32767,'\n');

return x;

}

 

위의 코드속 ignore에서 입력값(32767,'\n')을 안넣어줘도 버퍼는 지워지는걸로 알고있는데, 안넣어준뒤 cin에서 123공백123 을 넣어주면 다시 뒷부분 cin에 버퍼에 저장된 값이 들어갑니다. 왜 ignore에 입력값을 넣어주어야 하는건가요??

 

또한 강의속에서 int 값에 너무 큰수가 들어갔을 떄를 대비하여 cin.clear로 버퍼를 비워준다하였는데 이미비워졌는데도 그뒤에 또 ignore을 사용하는 이유는 무엇인가요?

 

답변 1

답변을 작성해보세요.

4

Soobak님의 프로필

Soobak

2023.04.22

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


질문 1.) 위의 코드속 ignore에서 입력값(32767,'\n')을 안넣어줘도 버퍼는 지워지는걸로 알고있는데, 안넣어준뒤 cin에서 123공백123 을 넣어주면 다시 뒷부분 cin에 버퍼에 저장된 값이 들어갑니다. 왜 ignore에 입력값을 넣어주어야 하는건가요??
: cin.ignore() 함수의 매개변수는 두 가지 입니다.
첫 번째 매개변수 n무시할 문자의 최대 개수 입니다. 이 때, 기본값은 1 입니다.
두 번째 매개변수 delim무시를 멈출 문자 입니다. 이 때, 기본값은 EOF 입니다.

따라서,

cin.ignore(32767, '\n');

의 경우, 최대 32,767 개의 문자를 무시하거나, '\n' 문자를 만날 때까지 문자를 제거하며 버퍼를 비웁니다.

만약,

cin.ignore();

와 같이 인자를 전달하지 않고 사용하면, 기본값에 따라 1 개의 문자만 무시하게 됩니다.

따라서, 말씀해주신 123(공백)123 을 예시로 들어보면,
첫 번째 숫자 123 이 입력되고, 뒤이어 (공백) 문자가 무시됩니다. 하지만, 그 뒤의 123 이 여전히 버퍼에 남아 있어 다음 입력 스트림에서 사용되게 됩니다.

cin.ignore() 함수의 정의를 살펴보시면 이해에 더 도움이 되실 것 같아, 관련 문서 첨부드립니다.
cplusplus-istream::ignore(링크)


질문 2.) 또한 강의속에서 int 값에 너무 큰수가 들어갔을 떄를 대비하여 cin.clear로 버퍼를 비워준다하였는데 이미비워졌는데도 그뒤에 또 ignore을 사용하는 이유는 무엇인가요?
: cin.clear()cin.ignore() 은 서로 다른 목적으로 사용됩니다.
cin.clear() 함수는 스트림의 상태 플래그를 초기화하는 데 사용됩니다. 입력스트림에서 오류가 발생하면, 스트림의 상태 플래그가 오류로 변경되며, 이후 입력 작업이 무시됩니다.
따라서, 이러한 상황에서 cin.clear() 를 사용하여 스트림의 상태 플래그를 초기화하여 다음 입력 작업이 정상적으로 수행되도록 하는 것입니다.

반면에, cin.ignore() 함수는 질문 1 에서 답변드린 것 처럼, 입력 스트림에서 문자를 무시하거나 버퍼를 비우는 데에 사용됩니다. 스트림의 상태 플래그와 상관없이 버퍼에 남아있는 문자를 제거하려면, cin.ignore() 를 사용해야 합니다.

즉, cin.clear() 로 상태 플래그를 초기화한 후에도, cin.ignore() 를 사용하는 이유는, 버퍼에 남아있는 문자를 제거하여 이전 입력 값이 다음 입력 작업에 영향을 주지 않도록 하기 위함입니다.


질문해주신 강의9:03 부분에서 발췌한 다음 코드 중 std::cin.fail() 함수가 사용된 부분을 참고하시면 이해가 더 수월하실 것 같습니다.

if (std::cin.fail())
{
  std::cin.clear();
  std::cin.ignore(32767, '\n');
  cout << "Invalid number, please try again" << endl;
}
else
{
  std:;cin.ignore(32767, '\n');
  return x;
}


또한, cin.clear()cin.fail() 함수의 정의에 대한 문서도 첨부드리오니, 한 번 참고해보시길 권장드립니다.
cplusplus-std::ios::clear(링크)
cplusplus-std::ios::fail(링크)