C++에서 입력 버퍼 지우기
이 기사에서는 C++에서 입력 버퍼를 지우는 방법에 대한 여러 방법을 보여줍니다.
std::cin::ignore
함수를 사용하여 C++에서 입력 버퍼 지우기
ignore
는std::cin
객체의 내장 함수이며 지정된 구분 기호까지 입력 스트림에서 문자를 추출하고 삭제하는 데 사용할 수 있습니다. cin::ignore
함수의 동작을 논의하기 전에cin
/cout
과 같은 표준 입력 및 출력 스트림이 버퍼링된다는 점에 유의해야합니다. 이는 사용자 쓰기 / 읽기 사이에 일부 부기가 발생 함을 의미합니다. 운영 체제 커널의 실제 버퍼 상태. 이 버퍼는 C++ 라이브러리 자체에 의해 관리되며 그 목적은 읽기 / 쓰기 요청을보다 효율적으로 만드는 것입니다. 각 바이트에 대해 운영 체제 서비스를 호출하는 것은 CPU 리소스를 매우 비효율적으로 사용하므로 중간 버퍼를 사용하여 일부 요청을 축적 한 다음 단일 요청으로 운영 체제를 호출합니다.
따라서cin::ignore
는 연속 호출이있을 때 실수로 읽을 수있는 버퍼에 남은 바이트를 버릴 수 있습니다. 다음 예제 코드는ignore
동작을보다 명확하게 보여주기 위해 설계되었습니다. 우리는cin
스트림에서 3 개의 정수를 읽고 해당 변수에 저장하는 무한while
루프를 구현했습니다. 정수는cout
에 인쇄되고 다음 반복에서 루틴이 실행됩니다. 사용자는 첫 번째 반복에서 3 개 이상의 정수를 제공 할 수 있습니다. 이 경우cin.ignore
앞의 코드는 이들 중 3 개만 저장하고 나머지는 여전히 중간 버퍼에 존재합니다. 이제cin.ignore
가 주어진 매개 변수로 호출되지 않으면 다음 반복cin >>
행이 입력의 나머지 부분을 읽고 일관성없는 동작이 발생합니다. 이러한 시나리오에서cin.ignore
호출을 활용하여 주어진 문자를 만나지 않을 때까지 입력을 버릴 수 있습니다. 이 경우 일반적으로cin
스트림을 버퍼링하는 데 사용되는 새 줄 문자를 지정했습니다.
#include <iostream>
#include <limits>
#include <sstream>
using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
int main() {
while (true) {
int i1, i2, i3;
cout << "Type space separated numbers: " << endl;
cin >> i1 >> i2 >> i3;
if (i1 == 0) exit(EXIT_SUCCESS);
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
cout << i1 << "; " << i2 << "; " << i3 << endl;
}
return EXIT_SUCCESS;
}
출력 (샘플 사용자 입력 포함) :
Type space separated numbers:
12 32 54
12; 32; 54
또는 공백 문자 구분 기호로 분할 된 두 개의 문자열을 사용하는 다른 예제 코드를 구현할 수 있습니다. 이 시나리오에서는 사용자가 2 개 이상의 이름을 제공하여이 코드가 공백으로 구분 된 2 개의 문자열 뒤에 모든 이니셜을 삭제하도록 할 가능성이 있습니다. 사용자 입력에 이름과 공백이 하나만있는 경우 항상cin
입력을 종료하는 개행 문자가 두 번째 이니셜로 저장됩니다. 후자의 동작은<< name << surname
문 뒤에 단일 문자 출력을 추가하여 설명 할 수 있습니다.
#include <iostream>
#include <limits>
#include <sstream>
using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
int main() {
char name, surname;
cout << "Type your name and surname: ";
name = cin.get();
cin.ignore(numeric_limits<std::streamsize>::max(), ' ');
surname = cin.get();
cout << "Your initials are: " << name << surname << endl;
return EXIT_SUCCESS;
}
출력 (샘플 사용자 입력 포함) :
Type your name and surname: Lama Lime
Your initials are: LL
``
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook