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.
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; }
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; }
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);
ajudou muito, eu ja estava enlouquecendo aqui kkkkkk, parabéns 😀
Que bom que meu artigo ajudou você.
Um grande abraço
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…