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 caracter, 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

2 Thoughts to “Como utilizar as funções getline e cin.ignore() do C++”

  1. malco

    ajudou muito, eu ja estava enlouquecendo aqui kkkkkk, parabéns 😀

    1. paulovmdutra

      Que bom que meu artigo ajudou você.
      Um grande abraço

Leave a Comment