C++에서 입력 버퍼 지우기

Jinku Hu 2023년10월12일
C++에서 입력 버퍼 지우기

이 기사에서는 C++에서 입력 버퍼를 지우는 방법에 대한 여러 방법을 보여줍니다.

std::cin::ignore함수를 사용하여 C++에서 입력 버퍼 지우기

ignorestd::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
``
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

관련 문장 - C++ IO