Usar a função ignore() em C++

Jinku Hu 12 outubro 2023
  1. Utilizar a função ignore() para descartar entrada de utilizador de linha de comando não pretendida
  2. Utilizar a função ignore para extrair as iniciais da entrada do utilizador em C++
Usar a função ignore() em C++

Este artigo irá explicar vários métodos de como utilizar a função ignore() em C++.

Utilizar a função ignore() para descartar entrada de utilizador de linha de comando não pretendida

A função ignore() é uma função de membro do std::basic_istream e é herdada por diferentes classes de fluxo de entrada. A função descarta os caracteres no fluxo até ao delimitador dado, inclusive, e depois extrai o resto do fluxo.

A função ignore aceita dois argumentos; o primeiro é o número de caracteres a extrair, e o segundo é o carácter delimitador.

O exemplo seguinte mostra como a função ignore é chamada no objecto cin para armazenar apenas 3 números e descartar qualquer outro input do utilizador. Note-se que utilizamos numeric_limits<std::streamsize>::max() como primeiro argumento da função ignore para forçar o caso especial e desactivar o parâmetro do número de caracteres.

#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::istringstream;
using std::numeric_limits;
using std::string;

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;
}

Resultado:

Type space separated numbers:
238 389 090 2232 89
238; 389; 90

Utilizar a função ignore para extrair as iniciais da entrada do utilizador em C++

Uma forma comum de utilizar a função ignore é procurar o fluxo de entrada para o delimitador desejado e extrair apenas os caracteres necessários.

Na amostra de código seguinte, a entrada do utilizador é analisada de modo a que apenas sejam extraídas as iniciais das strings separadas por espaço. Repare que estamos a utilizar cin.get duas vezes para extrair um único caracter do fluxo, mas a declaração cin.ignore entre eles assegura que cada caracter antes e incluindo o espaço seguinte é descartado.

#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
using std::string;
using std::vector;

int main() {
  char name, surname;
  cout << "Type your name and surname: " << endl;
  name = cin.get();
  cin.ignore(numeric_limits<std::streamsize>::max(), ' ');
  surname = cin.get();

  cout << "Your initials are: " << name << surname << endl;

  return EXIT_SUCCESS;
}

Resultado:

Type your name and surname:
Tim Cook
Your initials are: TM
Autor: 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

Artigo relacionado - C++ IO