Como utilizar as funções getline e cin.ignore() do C++

Share Button

Na linguagem C++ existe algumas formas básicas de se realizar extrações de dados do teclado: Utilizando o objeto cin ou a função getline. A diferença básicas entre as duas formas é que o objeto cin pode ser utilizado para realizar leitura de uma sequência de dados que serão inseridas em variáveis numéricas, int, float, double,  long ou strings e caracteres, sem espaços e sem tabulações. Para realizar a extração desses dados é utilizado o operador de extração “>>”. O método getline é  utilizado apenas com o tipo string, esse método recebe como parâmetro o objeto cin, seguido da variável do tipo string que irá armazenar os caracteres extraídos do teclado, permitindo também o uso de espaços e tabulações.

Veja o exemplo abaixo utilizando o objeto cin:

#include <iostream>
 
using namespace std;
 
int main()
{
 
	string nome;
	string endereco;
	string bairro;
 
	cout << "Nome: ";
	cin >> nome;
 
	cout << "Endereco: ";
	cin >> endereco;
 
	cout << "Bairro: ";
	cin >> bairro;
 
	cout << endl << endl;
 
	cout << "Exibindo os dados: " << endl;
	cout << "Nome: "     << nome << endl;
	cout << "Endereco: " << endereco << endl;
	cout << "Bairro: "   << bairro << endl;
 
	return 0;

}

Observe que ao executar o programa e escrever algum dado que contenha espaços, o comando cin interpretou que o espaço e o final do caractere, salta para o próximo comando cin, e armazena a segunda palavra que esta no buffer no próximo comando.

FuncaoGetLine1

Para corrigir esse problema, basta utilizar o método getline, como descrito anteriormente, este método recebe dois parâmetros, o objeto cin, utilizado para extrair as informações digitadas pela teclado, já o segundo parâmetro recebe uma variável do tipo string que será utilizada para armazenar os dados extraídos pelo método cin.

#include <iostream>
 
using namespace std;
 
int main()
{
 
	string nome;
	string endereco;
	string bairro;
 
	cout << "Nome: ";
	getline(cin, nome);
 
	cout << "Endereco: ";
	getline(cin, endereco);
 
	cout << "Bairro: ";
	getline(cin, bairro);
 
	cout << endl << endl;
 
	cout << "Exibindo os dados: " << endl;
	cout << "Nome: "     << nome << endl;
	cout << "Endereco: " << endereco << endl;
	cout << "Bairro: "   << bairro << endl;
 
	return 0;
 
}
FuncaoGetLine2

Utilizando o método getline foi possível resolver o problema facilmente. Mas o que acontecerá se for incluída uma nova variável do tipo int para informar um novo dado?

#include <iostream>
 
using namespace std;
 
int main()
{
	
	int codigo;
	string nome;
	string endereco;
	string bairro;
 
	cout << "Informe os dados" << endl;
	cout << "Codigo: ";
	cin >> codigo;
 
	cout << "Nome: ";
	getline(cin, nome);
 
	cout << "Endereco: ";
	getline(cin, endereco);
 
	cout << "Bairro: ";
	getline(cin, bairro);
 
	cout << endl << endl;
 
	cout << "Exibindo os dados: " << endl;
	cout << "Nome: "     << nome << endl;
	cout << "Endereco: " << endereco << endl;
	cout << "Bairro: "   << bairro << endl;
 
	return 0;
 
}
ProblemasBufferComgetline

Podemos observar que ao informar o valor do código e pressionar o enter houve um salto para o campo Endereco, esse problema ocorre pois o comando ‘\n’ (quebra de linha) está no buffer fazendo com que o comando getline interprete que é o final do caracter, por esse motivo é realizado um salto para o próximo comando.

Para resolver esse problema é muito simples, basta adicionar o comando cin.ignore() antes do comando getline. O comando ignore() finaliza a extração de caracteres, com isso, ao executar a função o caracter de quebra de linha é removido do buffer.

cout << "Informe os dados" << endl;
cout << "Codigo: ";
cin >> codigo;
 
cin.ignore();
 
cout << "Nome: ";
getline(cin, nome);
ComandoIgonre

Comments

comments

3 comentários em “Como utilizar as funções getline e cin.ignore() do C++”

  1. Muitíssimo obrigado! Esse problema estava me ocorrendo em meio a um programa maior, e fui revirando por horas até entender onde estava o erro. Eu não conhecia “cin.ignore();”, simples e essencial, rs…

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *