23.04.22 17:14 작성
·
1.2K
·
수정됨
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
5
안녕하세요, 답변 도우미 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(링크)